2011-12-06 109 views
5

PresentationCore.dll中和WindowsBase.dll中使用PresentationCore和WindowsBase DLL文件都包含在Microsoft .NET Framework 3.0中,每個DLL的兩個版本安裝到硬盤:兩個x64和x86環境

  • 的64位版本下的C:\ Program Files文件\參考大會\微軟\框架\ 3.0
  • 在C的86版本:\程序文件(x86)\參考大會\微軟\框架\ 3.0

在添加對這些dll的引用之前,我們的ASP.NET web應用程序能夠編譯爲「任何CPU」,並且可以在32位或64位模式下運行而不會出現問題。通過標準,比方說,PresentationCore添加的引用之後「添加引用」對話框(添加引用 - > .NET - > PresentationCore),該網絡應用程序失敗與以下錯誤64位模式時:

Could not load file or assembly 'PresentationCore' or one of its dependencies. An attempt was made to load a program with an incorrect format.

顯然這是因爲64位應用程序池試圖加載PresentationCore DLL的32位版本,並且無法加載。

現在,我這個有點困惑...

  1. 其他.NET框架的dll似乎無縫的x64和x86版本之間進行切換(從Microsoft.NET/Framework64或加載Microsoft.NET /框架)。爲什麼PresentationCore和WindowsBase有什麼不同?
  2. 爲什麼Visual Studio中似乎只提供我在‘添加引用’對話框中的「.NET」選項卡下的32位版本?如果我想要64位版本,我必須「瀏覽」它。
  3. 有沒有什麼簡單的方法來自動選擇了正確的DLL,就像似乎發生了其他.NET Framework庫?

我們總是可以寫一點MSBuild xml,它會在構建時根據目標環境的位數自動交換引用,但這似乎是我們不應該爲.NET Framework dll所做的事情。是什麼賦予了?

謝謝!

+0

您確定沒有使用Browse添加引用嗎?你有沒有嘗試刪除它,然後再次添加? – svick

+0

是的,很確定。是的,我們嘗試刪除它並重新添加它幾次。 –

+1

我通過在應用程序池高級設置中啓用「啓用32位應用程序」來解決此問題。 – Nippysaurus

回答

3

它可以有條件地引用每個符合您的積極構建配置的.dll文件。您需要手動編輯您的項目文件。添加對32位DLL的引用。然後保存該項目並在文本編輯器中編輯.csproj文件。

搜索「(平臺)$ ==‘86’」您添加並添加條件=基準作爲參考元素的屬性。然後製作另一個Reference元素的副本,並調整它爲x64版本。下面是與Oracle ODP.NET驅動程序爲例:

<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64" Condition="$(Platform) == 'x64'"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>lib\x64\Oracle.DataAccess.dll</HintPath> 
    <Private>True</Private> 
</Reference> 
<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" Condition="$(Platform) == 'x86'"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>lib\x86\Oracle.DataAccess.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

一個需要注意的重要一點是,你將不再能夠使用「AnyCPU」配置。您需要具有x86或x64的顯式構建配置。您嘗試使用的.dll可能會將本機呼叫轉換爲操作系統庫,因此您的項目不再是平臺不可知的。

如果你只是想維持1個構建配置,你可以使用x86去,只使用86位/ 32位版本。如果它是一個Web應用程序,則需要將應用程序池放入32位模式。

編輯回答你原來的qeustions

  • 你,當你建立一個DLL /可執行的平臺選擇了一把:任何CPU,X86,x64或安騰。在託管代碼中寫入100%且不依賴本地庫的代碼通常編譯爲&,分配爲AnyCPU。這是因爲編譯器生成的結果中間語言(IL)代碼可以在.NET Framework的x86,x64和Itanium版本上運行。針對任何CPU的庫可以從平臺特定的應用程序(x86,x64,IA64)安全地引用。 PresentationCore和WindowsBase不同的原因是因爲它們依賴於本機代碼。與在運行時解釋的IL代碼不同,本機代碼中沒有任何CPU的概念。由於本地代碼依賴性,PresentationCore和WindowsBase .NET庫需要作爲x86和x64進行分發,因爲AnyCPU是不可能的。
  • 「添加引用」對話框應該只顯示與您定位的平臺兼容的庫。如果您的目標平臺是x86,則它應該只顯示任何CPU和x86庫。
  • 不幸的是,沒有。如果您不能使用任何CPU,但仍然需要支持x86和x64,那麼您需要設置多個構建配置(一個用於x86,一個用於x64),並有條件地引用您需要的32位和64位dll。我知道這樣做的唯一方法是編輯上面詳述的項目文件。您需要構建兩種配置並分發代碼的單獨32位和64位版本。如果有人依賴於你的代碼,他們將需要跳過相同的箍環。
+0

感謝您的回覆。我們已經對我們的項目應用了一個類似於您在此描述的修復程序,但是我更感興趣的是*爲什麼*我們必須這樣做。你能回答我提出的任何問題嗎? –