2014-03-03 80 views
3

我是新來創建.NET應用程序,ESP混合應用程序。.NET應用程序加載混合的DLL,使用任何CPU

最近,我爲(非託管)C++(MS Visual Studio 2010下)的客戶端創建了一組(靜態)庫,它們支持由某些應用程序加載的32位和64位編譯,以及這通常很好。 (在內部,此功能使用各種其他第三方庫,如OpenGL,boost,glm等)

現在他希望能夠使用我在C#應用程序中作爲自定義控件提供的一些功能。

因此,我創建了一個CLR支持的DLL,使用C++/CLI爲我的功能創建包裝類,然後創建了一個自定義的WPF控件,它是公共的(因此可以從外部訪問),它也可以正常工作構建32位和64位。

然後爲了測試,我創建了一個簡單的C#應用​​程序(它非常簡單,因爲我是C#的新手,我的背景是C/C++),它可以構建在32位或64位,並且可以成功加載從我的DLL中進行控制,並執行預期的操作。

我現在遇到的問題是他說他希望能夠只發佈一個單一的可執行文件作爲「任何CPU」,然後根據它的啓動位置加載適當的代碼(即32位或64位)。

所以我做了什麼是添加一個「任何CPU」配置到C#測試項目,並將「構建」選項卡下的「平臺目標」設置爲「任何CPU」。但是現在我不確定在Configuration Manager下爲其他項目設置了什麼平臺(即C++/CLI混合模式dll所使用的C++靜態庫)。因此,對於測試中,我把它忘在x64上,但是當我建造它,我得到警告:

Warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "(name of my 64 bit dll)", "AMD64". <br /> 
This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project. 

它運行正常不過,即使它給我的警告。當我將其他項目設置爲「Win32」時,我只會提到「x86」,但在這種情況下,它會在啓動時拋出一個異常,說「PresentationCore.dll中發生了'System.BadImageFormatException'類型的未處理異常「

那麼我需要將其更改爲?我怎樣才能加載可執行文件,然後決定加載哪個dll?我真的不知道如何繼續並按照我所要求的方式進行工作。

+0

https://www.youtube.com/watch?v=7qnd-hdmgfk –

回答

1

我發現了一篇文章在解決問題的方法有關使用Perforce公司庫:

http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/

從本質上講,你必須創建一個代理DLL,它就是你的產量目標,並作爲託管參考C#(我的例子中的WPF)應用程序。

然後,您將創建dll的x64和x86版本,並將其與可執行文件一起提供。你必須確保代理DLL不會與可執行文件一起存在。

在啓動時,您將爲AppDomain.CurrentDomain.AssemblyResolve創建一個事件處理程序,它將在無法找到代理dll時觸發它。

然後根據你是否在一個32位或64位的環境,它可以選擇正確的DLL並加載它。

相關問題