托管 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++ 调用 C# 函数(通过托管包装器)

从托管 C# 代码调用非托管 C++ 代码以生成脱机域加入 blob

我想从 C++ 非托管代码调用 C# 委托。无参数委托工作正常,但有参数委托使我的程序崩溃

调试从非托管 C++ 调用的托管 .NET 代码