托管C#代码未发生非托管调用

时间:2018-10-15 07:08:04

标签: c# c++ interop

我正在从托管代码中调用非托管函数。但是未托管的呼叫不会发生。

托管的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”

请帮助我解决此问题。

1 个答案:

答案 0 :(得分:1)

您必须使用IsUPSPresent属性声明__declspec(dllexport)或使用.def文件。另外,要克服C ++名称修饰的问题,您的定义必须是C ++代码中的extern "C"

extern "C" {
    BOOL __declspec(dllexport) IsUPSPresent()
    {
        BOOL bRetValue = FALSE;
        return bRetValue;
    }
}