2014-11-01 33 views
1

我有一個F#.NET解決方案,包含一些託管C#.NET和非託管C++ DLL引用。相同的F#.NET解決方案在32位操作系統下的FSI中工作,但不在64位操作系統下工作

該解決方案在FSI 32位Windows 7 Enterprise下完美運行。但是,如果我複製一切在解決計算機與64位Windows操作系統8.1,保持引用的DLL的所有相對和絕對路徑,文件等一樣,FSI給我

System.DllNotFoundException: Unable to load DLL 'dllName': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

錯誤的非託管C++ DLL名爲dllName是解決方案的一部分,被複制,是否存在,被引用。

dllName在\ x64和\ x86文件夾下同時具有32位和64位版本。它們都被引用,被複制並存在。 32位操作系統和64位操作系統上的項目屬性都相同。我還嘗試了所有可能的組合和平臺設置的屬性 - >調試以及配置,平臺和平臺目標設置的屬性 - >生成在64位操作系統下無濟於事。

我猜想FSI在32位操作系統中出現在任務管理器中的Fsi.exe (32-bit)出現在64位操作系統中,但Fsi.exe是32位操作系統中的32位應用程序的罪魁禍首,沒有我觸摸解決方案的任何部分。

+0

你做了什麼來確保操作系統可以找到那個x86子目錄中的DLL是相當不清楚的。無論您是否也在部署DLL所需的依賴DLL,每個人都會忘記複製CRT依賴項。最簡單的診斷方法是運行SysInternals的Process Monitor。接近追蹤結束時,您會看到該程序正在搜索缺少的DLL並未找到它。 – 2014-11-01 12:31:32

+0

@Hans Passant感謝您的建議。使用進程監視器進行檢查,似乎fsi.exe試圖在任何地方查找DLL(異常的地方,如C:\ Users \ Rebecca \ AppData \ Local \ assembly \ dl3 \ KYOX0B1Q.Z4R \ 76HH9QN1.6KW \ eadfc563 \ 00e04bbe_6b74cf01 \等。)除了它實際上。所以我將DLL複製到了它正在查找的文件夾中,現在它可以工作 - 我想這不是一個穩定的解決方案。但是,我仍然不明白我需要爲fsi.exe找到它實際上在64位操作系統下的DLL。爲什麼fsi.exe試圖在除了實際引用的地方之外的任何地方查找它? – bugfoot 2014-11-01 19:58:45

+0

您是否嘗試在工具|選項| F#工具| 64位F#Interactive中將_64位F#Interactive_設置爲true?在64位系統上,重置FSI後,FSI進程將顯示爲FsiAnyCPU.exe,而不是您的示例中的Fsi.exe(32位)。 – 2014-11-02 13:42:07

回答

0

下旬〜我知道黨,但對於未來搜索的好處:

我有這個確切的問題,當我的F#應用程序動態地從一個共享加載混合模式的C++/CLI DLL(非託管DLL依賴) 。

它在非交互式運行良好,但未能在交互式中加載DLL。

我的問題是影子複製,它不適用於DLL的非託管依賴關係。

解決方案是關閉F#交互式影子複製。該設置在Tools->Options->F# tools->Shadow copy assemblies之下。如果我將其設置爲false,則一切正常。

相關問題