2012-05-02 116 views
6

我有我從C#項目引用一個託管C++ DLL。 C#項目將被編譯爲AnyCPU。有沒有辦法編譯一個32位和64位版本的Managed C++ dll,然後在運行時告訴C#項目加載正確的一個,具體取決於它運行的是哪個體系結構?託管C++和AnyCPU

回答

3

This article討論一個複雜的方式來做到這一點,看看Stefan的評論,討論適用於某些應用程序更簡單的方法。

1

我不知道該怎麼做,你「參考」 C++的DLL(P/Invoke的VS .NET程序集的引用),但無論哪種方式,你可以在安裝時交換.dll文件的兩個版本。

1

獲取AnyCPU dll與C++ dll一起玩的技巧是在運行時確保程序集無法加載C++ dll,然後訂閱AppDomain AssemblyResolve事件。當程序集試圖加載dll並失敗時,那麼你的代碼有機會確定哪個dll需要加載。

訂閱事件看起來是這樣的:

System.AppDomain.CurrentDomain.AssemblyResolve += Resolver; 

事件處理程序看起來是這樣的:

System.Reflection.Assembly Resolver(object sender, System.ResolveEventArgs args) 
{ 
    string assembly_dll = new AssemblyName(args.Name).Name + ".dll"; 
    string assembly_directory = "Parent directory of the C++ dlls"; 

    Assembly assembly = null; 
    if(Environment.Is64BitProcess) 
    { 
      assembly = Assembly.LoadFrom(assembly_directory + @"\x64\" + assembly_dll); 
    } 
    else 
    { 
      assembly = Assembly.LoadFrom(assembly_directory + @"\x86\" + assembly_dll); 
    } 
    return assembly; 
} 

我創建了一個簡單的項目演示如何從AnyCPU DLL訪問C++的功能。

https://github.com/kevin-marshall/Managed.AnyCPU

+0

好奇,爲什麼我得到了這條評論向下票呢? –

+0

我也是。我不確定我是否會在生產中這樣做,但這至少是一個可行的想法。 Upvoted回到零,以恢復不公正 –

+0

謝謝伊萬!我感謝你的支持:) –