我有我從C#項目引用一個託管C++ DLL。 C#項目將被編譯爲AnyCPU。有沒有辦法編譯一個32位和64位版本的Managed C++ dll,然後在運行時告訴C#項目加載正確的一個,具體取決於它運行的是哪個體系結構?託管C++和AnyCPU
6
A
回答
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++的功能。
相關問題
- 1. 託管C++和C#
- 2. 託管和非託管C++和Boost
- 3. C++託管和非託管靜態庫
- 4. C#AnyCPU和Read/WriteProcessMemory的
- 5. 非託管C++ COM和託管C++ .NET4互操作
- 6. 託管和非託管堆
- 7. lineTranslateAddress C++託管c#
- 8. GC和C#非託管代碼/ C++
- 9. 託管C++和C#有什麼區別?
- 10. 混合託管/非託管C++?
- 11. Gdiplus在C++託管或非託管?
- 12. C++託管到非託管轉換
- 13. 在C++中託管和非託管類型之間的轉換?
- 14. C++/CLI:非託管類的聲明和託管類
- 15. 混合託管和非託管C++代碼?
- 16. LNK 2028 - 2019 /託管和非託管C++? (VS 2008)
- 17. VC++和C#如何編寫託管DLL或非託管DLL?
- 18. 非託管char *數組託管System ::字符串託管C++
- 19. 託管類型C++
- 20. 託管C++ ref類
- 21. C++託管代碼
- 22. 託管C++前景
- 23. SHDOCVW在託管C++
- 24. 瞭解託管C++
- 25. 在非託管C++ DLL和託管C#UI之間發送信息
- 26. 非託管內存和託管存儲
- 27. 橋接非託管和託管類
- 28. 純C++與託管C++
- 29. 類託管C++從C#
- 30. C++/CLI託管包裝和ADODB :: Recordset
好奇,爲什麼我得到了這條評論向下票呢? –
我也是。我不確定我是否會在生產中這樣做,但這至少是一個可行的想法。 Upvoted回到零,以恢復不公正 –
謝謝伊萬!我感謝你的支持:) –