托管 C# 代码未发生非托管调用
Posted
技术标签:
【中文标题】托管 C# 代码未发生非托管调用【英文标题】:Unamanaged call is not happening from the managed C# code 【发布时间】:2018-10-15 07:08:04 【问题描述】:我正在从托管代码调用非托管函数。但未发生非托管调用。
托管 C# 代码: (从 Visual C# -> 控制台应用程序创建了一个项目(Sampletest)) 样品测试:
namespace Sampletest
class Program
const string Dllpath2 = @"C:\Users\Sampletest\SampleDll\Debug\SampleDll.dll";
[DllImport(Dllpath2, EntryPoint = @"IsTherePower", CallingConvention = CallingConvention.Cdecl)]
public static extern Boolean IsTherePower();
static void Main(string[] args)
var test = IsTherePower();
Console.ReadKey();
非托管 C++ 代码:
(从 Visual C++ -> Windows 桌面 -> 动态链接库创建了一个 dll 项目(SampleDll))
“IsTherePower()”定义在 SampleDll.cpp 中
#include "stdafx.h"
BOOL IsTherePower()
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 IsTherePower() 函数
并在“var test = IsTherePower();”处返回托管调用
显示错误“Sampletest.exe 中 0x7705D6C7 (ntdll.dll) 处的未处理异常:0xC0000096:特权指令。
我所做的设置:
对于 C# 项目,
Debug->选中“启用本机代码调试”
我选择了“调试”、“x86”
请帮我解决这个问题。
【问题讨论】:
【参考方案1】:您必须使用__declspec(dllexport)
属性声明IsUPSPresent
或使用.def
文件。此外,为了克服 C++ 名称混淆,您的定义必须在 C++ 代码中为 extern "C"
。
extern "C"
BOOL __declspec(dllexport) IsUPSPresent()
BOOL bRetValue = FALSE;
return bRetValue;
【讨论】:
我添加了“__declspec(dllexport)”属性,但仍然遇到同样的问题。 如果你没有将函数声明为extern "C"
,它的名字仍然是错误的。以上是关于托管 C# 代码未发生非托管调用的主要内容,如果未能解决你的问题,请参考以下文章
未导出成员函数时,从 C# 调用 C++ 本机/非托管成员函数
从托管 C# 代码调用非托管 C++ 代码以生成脱机域加入 blob