2008-08-22 87 views
16

我遇到了一個與here(加載程序集及其依賴關係)所述類似但存在細微差別的問題。如何在運行時延遲綁定32位/ 64位庫

我有一個用於3D渲染的C++ DLL,這是我們向客戶銷售的產品。對於.NET用戶,我們將有一個CLR包裝器。 C++ DLL可以構建在32位和64位版本中,但我認爲這意味着我們需要有兩個CLR包裝器,因爲CLR綁定到特定的DLL?

現在說我們的客戶有一個可以是32位或64位的.NET應用程序,它是一個純粹的.NET應用程序,它使CLR能夠從一套程序集中解決問題。問題是應用程序代碼在運行時如何在我們的32位和64位CLR/DLL組合之間動態選擇?

甚至更​​具體地說,對於上述問題的建議答案也適用於此(即創建ResolveEvent處理程序)?

回答

8

我終於有這個似乎工作的答案。

編譯兩個32 & 64位版本 - 兩個管理的&非託管 - 到單獨的文件夾。然後讓.NET應用程序在運行時選擇從哪個目錄加載程序集。

使用ResolveEvent的問題在於,如果找不到組件,它只會被調用,所以很容易意外終止32位版本。相反,使用第二個AppDomain對象,我們可以將ApplicationBase屬性更改爲指向正確的文件夾。所以,你最終用類似的代碼:

static void Main(String[] argv) 
    { 
    // Create a new AppDomain, but with the base directory set to either the 32-bit or 64-bit 
    // sub-directories. 

    AppDomainSetup objADS = new AppDomainSetup(); 

    System.String assemblyDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 
    switch (System.IntPtr.Size) 
    { 
     case (4): assemblyDir += "\\win32\\"; 
      break; 
     case (8): assemblyDir += "\\x64\\"; 
      break; 
    } 

    objADS.ApplicationBase = assemblyDir; 

    // We set the PrivateBinPath to the application directory, so that we can still 
    // load the platform neutral assemblies from the app directory. 
    objADS.PrivateBinPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

    AppDomain objAD = AppDomain.CreateDomain("", null, objADS); 
    if (argv.Length > 0) 
     objAD.ExecuteAssembly(argv[0]); 
    else 
     objAD.ExecuteAssembly("MyApplication.exe"); 

    AppDomain.Unload(objAD); 

    } 

你最終2個EXE文件 - 您的正常應用,並且選擇哪些位加載第二切換應用程序。 注 - 我不能讚揚這個我自己的細節。我的一位同事懷疑我已經給了我最初的指示。如果當他註冊到StackOverflow時,我會給他分配答案

1

我以前遇到過類似的情況。我使用的工具包在64位環境中表現不佳,我無法找到動態強制程序集綁定爲32位的方式。

可以強制你的程序集工作在32位模式下,但這需要修補CLR頭文件(有一個工具可以在框架中完成),如果你的程序集是強命名的,鍛鍊。

恐怕您需要爲32位和64位平臺構建和發佈兩套二進制文件。

3

大約一年前我能夠做到這一點,但我不再記得所有的細節。基本上,您可以使用IntPtr.Size來確定要加載哪個DLL,然後通過p/Invoke執行實際的LoadLibrary。在那個時候,你已經在內存中獲得了模塊,你應該能夠從內部調用p/Invoke函數 - 不應該再次重新載入相同的模塊名稱。我認爲,在我的應用程序中,我實際上已經將C++ DLL註冊爲COM服務器,然後通過生成的.NET包裝來訪問它的功能 - 所以我不知道我是否曾經測試過p /直接調用。