我有一个在VS 6.0中开发的非托管C ++ MFC dll。我想在我的C#应用程序中使用它。我正在尝试使用PInvoke。
这是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#调用方法“test”:
// 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(“在共享DLL中使用MFC”),我就会收到此错误:
未处理的异常:System.DllNotFoundException:无法加载DLL'TestDll.dll':找不到指定的模块。 (来自HRESULT的异常:0x8007007E) 在PlatformInvokeTest.test(Int32号码)
谢谢!
答案 0 :(得分:1)
DLL需要位于系统可以拾取它的路径中。你把它放在你的应用程序启动的目录中? (可能在你VS解决方案的DEBUG文件夹中)。
第二个选项是为它提供DLL的绝对路径。
第三个选项是将它放在“c:\ windows \ System”中,但这是'-1'方法:D
答案 1 :(得分:1)
通常,当您遇到这样的错误时,可以使用Assembly Binding Log Viewer来确定dll是否由于缺少依赖而无法加载。
在您的特定情况下,最可能的原因是您正在动态地将您的dll链接到MFC,并且当C#应用程序尝试加载您的dll时,它无法加载MFC dll。
您可以并排复制所需的MFC dll,也可以切换到静态链接MFC到lib。
答案 2 :(得分:1)
TestDll.dll可能无法加载其中一个依赖DLL。
尝试在Depends(Dependency Walker)实用程序中加载TestDll.dll文件。应该在Microsoft Visual Studio 6.0工具下使用VC 6安装。这将向您展示DLL具有哪些依赖关系,并在其中一个依赖关系失败时标记。
确保从C#代码所在的文件夹中加载TestDll.dll。
请注意,Depends仅适用于非托管DLL。