2011-09-24 35 views
6

我需要引用一個DLL有2個版本(一個用於32位和一個用於64位)。 我的目標是構建一個適用於32位和64位系統的Web應用程序。使用32位或64位特定的DLL取決於進程位

我想到了默認引用32位的裝配和使用AssemblyResolve事件加載64位版本(如果加載32位版本的失敗):

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += _AssemblyResolve; 
    // Try LoadAssembly ... 
} 

static System.Reflection.Assembly _AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    var path = string.Format(@"...\lib_x64\{0}.dll", args.Name); 
    return Assembly.LoadFrom(path); 
} 

但即使BadImageFormatException發生時,_AssemblyResolve處理程序將不叫。有沒有其他方法可以實現建議的行爲?

回答

0

answers for dealing with this for System.Data.SQLite

我認爲你提出的方法應該可以工作,但是你需要移動32位版本,所以默認情況下不能找到它,所以_AssemblyResolve總是要求該DLL。這只是一個猜測。

+0

看起來沒有更好的方法。不管怎麼說,還是要謝謝你。 – ollifant

1

最直接的方法,但是從我的角度來看不夠靈活被明確指定使用Condition中的csproj文件平臺的具體引用:

<ItemGroup Condition=" '$(Platform)' == 'x86' "> 
    <Reference Include="MyAssemblyx86"> 

您也可以使用動態Assembly.Load(AssemblyName)方法重載做到這一點。 參數是AssemblyName類型的暴露可能被設置爲無財產AssemblyName.ProcessorArchitecture的,MSIL,X86,X64,IA64,AMD64

一個你也可以考慮的事情是Publisher Policy File功能和命令行參數/platform:processorArchitecture

+0

在項目文件中使用條件僅在構建時有所區別。因此,仍然需要重新分配兩個不同的版本。 – ollifant

+0

Assembly.Load解決方案可以工作,但這需要我使用大量的反射。或者,也許動態也可以.. – ollifant

+0

@ollifant:.NET框架支持兩種組裝解決方法 - 通過靜態或動態引用。動態引用 - Assembly.Load()/ etc,static - 通過項目文件引用程序集或通過元數據作爲其他引用的依賴關係。有一件事你也可以看看'發佈者策略文件'功能和命令行參數'/ platform:processorArchitecture' – sll