2012-07-24 47 views
5

可能重複:
Loading x86 or x64 assembly.NET AnyCPU項目鏈接平臺特定的庫

我試圖編譯任何CPU .NET項目,但我有鏈接它有SQLite庫x86和x64平臺的不同版本。僅將DLL版本更改爲x64沒有幫助,應用程序無法啓動,我需要使用x64引用重新編譯代碼。 當我添加x86和x64引用時,由於衝突,它無法編譯。 我無法使用x86編譯應用程序,因爲我使用的系統COM庫之一在WOW64下不起作用。

All 32-bit VSS applications (requesters, providers, and writers) must run as native 32-bit or 64-bit applications. Running them under WOW64 is not supported

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

所以我需要建立任何CPU項目,但這個問題我看到目前唯一的解決辦法是有用於x86和x64的重複項目。有更好的嗎?

UPDATE

當我引用項目64庫,但嘗試加載86庫我得到下面的異常。

The located assembly's manifest definition does not match the assembly reference.

+0

謝謝。我見過這樣的帖子,但問題在於改變DLL只是沒有多大幫助。當我將64位DLL複製到我的文件夾時仍不起作用,我仍然需要重新編譯引用這些64位庫的應用程序。難道我做錯了什麼?我也不明白我應該參考哪個版本? – axe 2012-07-24 11:45:31

+1

是的。本機庫必須具有相同的名稱,但必須位於不同的文件夾中(例如應用程序的子文件夾)。在運行時你可以調用SetDllDirectory來使操作系統在正確的文件夾中查找位數。或者使用[由Rover建議]的AppDomain.CurrentDomain.AssemblyResolve事件(http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754)。你不直接引用這些庫,SQLite託管包裝器。你的代碼將使包裝器加載底層本地庫的正確版本。 – GSerg 2012-07-24 11:49:07

+0

我再次嘗試過,它不適合我。應用程序在啓動時崩潰。問題是我在項目中引用了x64庫,但我在運行時選擇了x86庫。如果我使用x86庫構建我的應用程序,它完全適用於x86窗口,否則它不會。 – axe 2012-07-24 12:04:52

回答

6

的主要問題是事實,我是使用x86和x64版本不同的SQLite的。 我添加方法

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args) 
{ 
    string platform = Environment.Is64BitProcess ? "x64" : "x86"; 
    string assemblyName = new AssemblyName(args.Name).Name; 
    string assemblyPath = Path.Combine(
     Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll"); 

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath); 
} 

而且在主應用程序入口點設置事件處理程序

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

。 現在,它相應地爲x86平臺和64位平臺上的x64加載x86程序集。

謝謝。