我想製作一個C++/MFC應用程序(所謂的「更新應用程序」),它可以從C#/。NET 3.5中編寫的其他應用程序中提取AssemblyVersion信息。
所以我可以根據我可以得到的版本信息更新我的C#程序。製作C++/MFC應用程序以從其他應用程序中提取AssemblyInfo?
我敢肯定這是可能的,但我不知道哪種方式是最好的方式。
我想知道一些技巧或關鍵字,我可以在網上搜索。
也可以直接解釋一下。
我想製作一個C++/MFC應用程序(所謂的「更新應用程序」),它可以從C#/。NET 3.5中編寫的其他應用程序中提取AssemblyVersion信息。
所以我可以根據我可以得到的版本信息更新我的C#程序。製作C++/MFC應用程序以從其他應用程序中提取AssemblyInfo?
我敢肯定這是可能的,但我不知道哪種方式是最好的方式。
我想知道一些技巧或關鍵字,我可以在網上搜索。
也可以直接解釋一下。
下面是我們在本地C++應用程序中如何做類似的事情。
編譯/clr
。你可以在整個項目範圍內或者在選定的C++文件上執行這個操作,但據我所知,選擇性地執行這些操作會有複雜性,所以我們只是在項目範圍內完成它。在適當的地方也是#include <vcclr.h>
。
你需要了解應用程序域。這裏最主要的是,一旦你將一個程序集加載到一個域中,除卸載整個域之外,你不能卸載程序集。既然你想加載一個程序集,查詢它的版本,然後放開它,你可能需要創建一個臨時域並加載到這個目錄中。
在我們的系統,我們有一個託管C++類叫ModelLoader加載對象模型,查詢自己的版本信息,並且將它們丟棄 - 就像你想要做什麼。這門課是我們託管/非託管編組的關鍵要素。
ModelLoader中的代碼必須在臨時域中執行,因爲我們希望它在那裏加載目標程序集,然後卸載域但是,主應用程序已經在主域中運行,因此它需要能夠將方法調用封送到臨時域中的ModelLoader。所以ModelLoader繼承System::MarshalByRefObject
,它允許.NET運行時完成所有的編組魔術。
所以基本步驟是這樣的:
加載包含ModelLoader的代碼的程序集。在我們的系統中,這被構建到我們的主要非託管.EXE中,所以我們只使用Reflection :: Assembly :: GetExecutingAssembly()來獲取它的句柄。如果您的ModelLoader的等價物位於獨立的程序集中,那麼您必須以某種方式加載它。但由於您可能不需要卸載此程序集,因此可以將其加載到主域中。
創建一個臨時域。
在臨時域中創建一個ModelLoader類的實例(顯然它將在您的系統中具有不同的名稱)。
元帥的句柄新實例回到你的主要領域。
從你的主要領域內使用手柄封在臨時域中執行代碼。
卸載臨時域。
所以,在代碼:
AppDomain ^domain = AppDomain::CreateDomain(L"temp domain");
Assembly ^assembly = Assembly::GetExecutingAssembly();
ObjectHandle ^handle = domain->CreateInstanceFrom(
assembly->Location,L"ModeLoader");
Object ^o = handle->Unwrap();
ModelLoader ^loader = dynamic_cast<ModelLoader^>(o);
loader->GetAssemblyVersion(...);
AppDomain::Unload(domain);
爲了節省您的頭刮,所涉及的命名空間是:
System::AppDomain
System::Reflection::Assembly
System::Runtime::Remoting::ObjectHandle
System::Object
在您ModelLoader,你要加載目標程序集並查詢其版本信息。相比於所有其他的東西,這很簡單:
void ModelLoader::GetAssemblyVersion(const wchar_t *filename, AssemblyName ^name)
{
Assembly ^assembly = Assembly::Load(gcnew String(filename));
name = assembly->GetName();
}
(我剛纔提出這個功能了,所以它可能不是很正確。)
另一件需要注意的是大會決議。這是程序集加載程序如何將程序集名稱解析爲DLL文件。這本身就是一個相當大的領域,所以我現在不再談論它了。 (在任何情況下,我都不是專家。)要開始,只要確保所有你想加載的程序集都在你的主應用程序目錄中,我想你會多或少。然後當你的基本加載工作,你可以擔心更復雜的分辨率。
你可以使用C++ cli嗎?或者它必須是mfc – rerun 2011-04-19 06:03:45
MFC對我來說會更好。使用CLI更容易嗎? – DynamicScope 2011-04-19 06:33:58