我正在从托管代码中调用非托管函数。但是未托管的呼叫不会发生。
托管的C#代码: (通过Visual C#->控制台应用程序创建了一个项目(最简单)) 样品测试:
namespace Sampletest
{
class Program
{
const string Dllpath2 = @"C:\Users\apc\source\repos\Sampletest\SampleDll\Debug\SampleDll.dll";
[DllImport(Dllpath2, EntryPoint = @"IsUPSPresent", CallingConvention = CallingConvention.Cdecl)]
public static extern Boolean IsUPSPresent();
static void Main(string[] args)
{
var test = IsUPSPresent();
Console.ReadKey();
}
}
}
非托管C ++代码:
(从Visual C ++-> Windows桌面->动态链接库创建了一个dll项目(SampleDll)
SampleDll.cpp中有“ IsUPSPresent()”定义
#include "stdafx.h"
BOOL IsUPSPresent()
{
BOOL bRetValue = FALSE;
return bRetValue;
}
但是,当我们进行非托管调用时,首先要转到非托管代码中存在的dllmain.cpp文件。
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
那么它就不会
BOOL IsUPSPresent()函数
并返回到“ var test = IsUPSPresent();”处的托管调用。
显示错误“ Sampletest.exe中的0x7705D6C7(ntdll.dll)出现未处理的异常:0xC0000096:特权指令。
我所做的设置:
对于C#项目,
Debug->选择“启用本机代码调试”
然后我选择了“调试”,“ x86”
请帮助我解决此问题。
答案 0 :(得分:1)
您必须使用IsUPSPresent
属性声明__declspec(dllexport)
或使用.def
文件。另外,要克服C ++名称修饰的问题,您的定义必须是C ++代码中的extern "C"
。
extern "C" {
BOOL __declspec(dllexport) IsUPSPresent()
{
BOOL bRetValue = FALSE;
return bRetValue;
}
}