我正在尝试从 C# 调用用 C++ 编写的自定义 DLL 中的函数。但是,我在代码分析期间收到警告,并在运行时收到错误:
警告:CA1400:
Microsoft.互操作性:正确
的声明
'SafeNativeMethods.SetHook()' 这样
它正确地指向现有的
“wi.dll”中的入口点。无人管理的
当前链接到的入口点名称
是SetHook。
错误:
System.EntryPointNotFoundException 是
未处理的。找不到条目
DLL“wi.dll”中名为“SetHook”的点。
wi.dll 和 C# exe 两个项目都已编译到同一个 DEBUG 文件夹中,两个文件都驻留在此处。整个文件系统中只有一个名为wi.dll的文件。
C++ 函数定义如下:
#define WI_API __declspec(dllexport)
bool WI_API SetHook();
我可以使用 Dependency Walker 查看导出的函数:
as decorated: bool SetHook(void)
as undecorated: ?SetHook@@YA_NXZ
C# DLL 导入看起来像(我使用 MSDN 杂志中的 CLRInsideOut 定义了这些行):
[DllImport("wi.dll", EntryPoint = "SetHook", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAsAttribute(UnmanagedType.I1)]
internal static extern bool SetHook();
我也尝试过不使用 EntryPoint 和 CallingConvention 定义。
两个项目都是32位的,我使用的是W7 64位,VS 2010 RC。
我相信我只是忽略了一些事情......
提前致谢。