2011-04-19 51 views
1

我想製作一個C++/MFC應用程序(所謂的「更新應用程序」),它可以從C#/。NET 3.5中編寫的其他應用程序中提取AssemblyVersion信息。
所以我可以根據我可以得到的版本信息更新我的C#程序。製作C++/MFC應用程序以從其他應用程序中提取AssemblyInfo?

我敢肯定這是可能的,但我不知道哪種方式是最好的方式。

我想知道一些技巧或關鍵字,我可以在網上搜索。

也可以直接解釋一下。

+0

你可以使用C++ cli嗎?或者它必須是mfc – rerun 2011-04-19 06:03:45

+0

MFC對我來說會更好。使用CLI更容易嗎? – DynamicScope 2011-04-19 06:33:58

回答

2

下面是我們在本地C++應用程序中如何做類似的事情。

編譯/clr。你可以在整個項目範圍內或者在選定的C++文件上執行這個操作,但據我所知,選擇性地執行這些操作會有複雜性,所以我們只是在項目範圍內完成它。在適當的地方也是#include <vcclr.h>

你需要了解應用程序域。這裏最主要的是,一旦你將一個程序集加載到一個域中,除卸載整個域之外,你不能卸載程序集。既然你想加載一個程序集,查詢它的版本,然後放開它,你可能需要創建一個臨時域並加載到這個目錄中。

在我們的系統,我們有一個託管C++類叫ModelLoader加載對象模型,查詢自己的版本信息,並且將它們丟棄 - 就像你想要做什麼。這門課是我們託管/非託管編組的關鍵要素。

ModelLoader中的代碼必須在臨時域中執行,因爲我們希望它在那裏加載目標程序集,然後卸載域但是,主應用程序已經在主域中運行,因此它需要能夠將方法調用封送到臨時域中的ModelLoader。所以ModelLoader繼承System::MarshalByRefObject,它允許.NET運行時完成所有的編組魔術。

所以基本步驟是這樣的:

  1. 加載包含ModelLoader的代碼的程序集。在我們的系統中,這被構建到我們的主要非託管.EXE中,所以我們只使用Reflection :: Assembly :: GetExecutingAssembly()來獲取它的句柄。如果您的ModelLoader的等價物位於獨立的程序集中,那麼您必須以某種方式加載它。但由於您可能不需要卸載此程序集,因此可以將其加載到主域中。

  2. 創建一個臨時域。

  3. 在臨時域中創建一個ModelLoader類的實例(顯然它將在您的系統中具有不同的名稱)。

  4. 元帥的句柄新實例回到你的主要領域。

  5. 從你的主要領域內使用手柄封在臨時域中執行代碼。

  6. 卸載臨時域。

所以,在代碼:

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文件。這本身就是一個相當大的領域,所以我現在不再談論它了。 (在任何情況下,我都不是專家。)要開始,只要確保所有你想加載的程序集都在你的主應用程序目錄中,我想你會多或少。然後當你的基本加載工作,你可以擔心更復雜的分辨率。

相關問題