2009-12-16 86 views
1

我有一個在VS 6.0中開發的非託管C++ MFC dll。我想在我的C#應用​​程序中使用它。我正在嘗試使用PInvoke。從C#調用非託管C++ VS 6.0 MFC dll

這裏是C++代碼:

// testDll.cpp : Defines the entry point for the DLL application. 
// 
#include "stdafx.h" 


extern "C" { 

BOOL APIENTRY DllMain(HANDLE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    return TRUE; 
} 

__declspec(dllexport) int test(int a) 
{ 
    return a * a; 
} 
} 

這裏是如何我試圖調用從C#方法「測試」:

// PInvokeTest.cs 
using System; 
using System.Runtime.InteropServices; 

class PlatformInvokeTest 
{ 

    [DllImport("TestDll.dll")] 
    internal static extern int test(int number); 

    public static void Main() 
    { 
     Console.WriteLine(test(5));  
    } 
} 

當我設置這種方式工作得很好C++的DLL只是一個普通的Win32 DLL。

但是,一旦我更改項目類型MFC(「使用MFC中共享DLL」)我得到這個錯誤:

未處理的異常:System.DllNotFoundException:無法加載DLL「TestDll.dll ': 指定的模塊無法找到。 (異常來自HRESULT:0x8007007E) at PlatformInvokeTest.test(Int32號碼)

謝謝!

回答

1

TestDll.dll可能無法加載它的一個依賴DLL。

嘗試在Depends(Dependency Walker)實用程序中加載您的TestDll.dll文件。應該在Microsoft Visual Studio 6.0 Tools下安裝VC 6。這將告訴你什麼依賴關係的DLL,並會標誌如果其中一個依賴關係失敗。

請確保您從C#代碼所在的文件夾中加載TestDll.dll。

請注意,取決於僅適用於非託管DLL。

+0

它的工作原理!非常感謝!依賴沃克正是我所需要的。 TestDll.dll有一個相關的DLL - MSVCRTD.DLL。在將此dll複製到項目文件夾後,C#應用程序運行得很好。 – 2009-12-16 21:05:10

+0

這意味着您對C++運行時具有依賴性。 MSVCRTD是運行時的調試版本。確保使用您的發行版本來重新分發非調試dll。 – 2009-12-17 20:38:28

1

該DLL需要位於系統可以檢測到的路徑中。你有沒有把它放在應用程序啓動的目錄中? (可能在VS解決方案的DEBUG文件夾中)。

第二個選項是給它的DLL的絕對路徑。

第三個選項是將它放在「C:\ WINDOWS \ SYSTEM」,但是這是一個「-1」的做法:d

+0

謝謝哈桑。 TestDll.dll位於bin文件夾中(.exe文件所在的位置)。實際上,當我將TestDll.dll作爲常規的Win32 dll編譯並放置到同一位置時,該程序工作得很好。只有當我將MFC編譯爲dll時,纔會出現此錯誤。 我想它與依賴關係有關,但我不確定究竟是什麼我也應該與MFC DLL一起添加... – 2009-12-16 20:30:43

1

一般情況下,當你打象這樣的錯誤,你可以使用Assembly Binding Log Viewer確定如果由於缺少依賴關係,DLL無法加載。

在你的特殊情況下,最可能的原因是你動態鏈接你的DLL到MFC,當C#應用程序嘗試加載你的DLL時,它無法加載MFC DLL。

您可以並排複製所需的MFC dll,也可以切換爲將MFC靜態鏈接到lib。