2010-08-19 83 views
1

我試圖在Win7 x64機器上安裝並運行32位應用程序。該應用程序構建爲Win32應用程序。它在32位平臺上運行良好。在x64機器上,它正確安裝在程序(x86)目錄中並運行正常,直到我撥打一個32位dll的電話。那時我得到不正確的格式錯誤(0x8007000b),表明它正在嘗試加載錯誤位的dll。事實上,它試圖從System32目錄中加載64位dll,而不是SystemWOW64目錄中的32位版本。32位dllimport在win7 x64平臺上生成不正確的格式錯誤(0x8007000b)

由dll供應商提供的另一個32位應用程序運行正常,它確實加載了SystemWOW64目錄中的32位dll。我的應用程序沒有源代碼來查看它們如何訪問DLL。

我正在使用如下所示的DllImport函數來訪問該dll。有沒有辦法裝飾DllImport調用強制它加載32位版本?

任何想法讚賞。

感謝,DP

public static class Micronas 
{ 
    [DllImport(@"UAC2.DLL")] 
    public static extern short UacBuildDeviceList(uint uFlags); 
    [DllImport(@"UAC2.DLL")] 
    public static extern short UacGetNumberOfDevices(); 
    [DllImport(@"UAC2.DLL")] 
    public static extern uint UacGetFirstDevice(); 
    [DllImport(@"UAC2.DLL")] 
    public static extern uint UacGetNextDevice(uint handle); 
    [DllImport(@"UAC2.DLL")] 
    public static extern uint UacSetXDFP(uint handle, short adr, uint data); 
    [DllImport(@"UAC2.DLL")] 
    public unsafe static extern uint UacGetXDFP(uint handle, short adr, IntPtr data); 
} 
+0

我已經做了更多的測試,並有更奇怪的結果...正如我下面評論。一個DLL實際上調用了上面的DllImport函數。我能夠創建一個正確使用這些函數的程序,即它們被稱爲32位。我創建了一個加載DLL的新程序,它可以進行調用,並且它也可以正常運行。失敗的程序具有相同的項目設置(x86),但Windows需要加載64位版本。我已經嘗試了corflags/32bit ++也無濟於事。我非常難過.... – DFP 2010-08-20 18:18:47

回答

0

由於您的帖子被標記爲C#,我假設這是一個.NET應用程序。它可能沒有被設置爲32位。您可以通過運行corflags.exe進行驗證,並使用corflags /32bit+ myapp.exe在其上設置32位唯一標誌。如果解決了這個問題,您需要修復解決方案/項目,將其構建爲x86而不是任何CPU。

+0

感謝您的建議。你是正確的,它是一個.NET應用程序,它包括一些DLL。 DLLs支持COM Interop,如果有任何方位的話。上面的DllImport代碼位於項目的一個DLL中。這些項目是用x86標誌重建的,我也嘗試了corflags,但都無濟於事。 有趣的是,我構建了一個新的C#項目,並使用上面的DllImport代碼沒有問題,即它正確加載了32位版本。我想我的下一步是嘗試新的DLL,看看是否有效。 – DFP 2010-08-20 16:07:26

6

強制您的.exe以32位模式運行。項目+屬性,生成選項卡,平臺目標= x86。

避免讓項目的平臺設置感到困惑,它實際上並不需要與實際設置相匹配。這是項目+屬性,生成選項卡,平臺目標。那裏一片混亂。

+0

只是爲了讓它更混亂,「平臺目標」取決於所選的配置。因此,您爲Debug版本指定了「x86」(而不知道它僅適用於Debug版本),並且一切正常,直到項目通過MSBuild最終發佈版本運行,並且在發現大量數據後,您會發現配置=發佈「平臺目標」仍然是「任何CPU」。哎呀! – RenniePet 2013-09-17 10:16:52

0

爲了強制應用程序在64位平臺上以32位模式運行,您可以在IIS應用程序池中設置它:在高級設置中將「啓用32位應用程序」設置爲TRUE。

相關問題