C# 为什么我的dllimport函数总是返回true? 我从一个错误管理的C++ DLL导出的函数有一个奇怪的问题,我用C++代码来实现:在C语言中返回的BoL总是正确的,不管我在C++中返回什么。我缩小了它,得到了一个C++文件,包含以下代码: #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) bool init() { return false; } #ifdef __cplusplus } #endif

C# 为什么我的dllimport函数总是返回true? 我从一个错误管理的C++ DLL导出的函数有一个奇怪的问题,我用C++代码来实现:在C语言中返回的BoL总是正确的,不管我在C++中返回什么。我缩小了它,得到了一个C++文件,包含以下代码: #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) bool init() { return false; } #ifdef __cplusplus } #endif,c#,c++,dllimport,dllexport,C#,C++,Dllimport,Dllexport,我将其构建到一个dll中,并在C#中导入函数: 运行此操作时,我得到以下输出: 初始化成功 我很困惑。有什么想法吗?bool是一种可怕的本地类型。每个人都有自己的方式。在C语言中, 的默认互操作映射到布尔O/C++ > C++类型,它处理的值与您的代码不同。 您需要使用[return:marshallas(UnmanagedType.I1)]来指定正确的编组,并且不要忘记使用C调用约定。哦,天哪。谢谢 using System; using System.Runtime.InteropServi

我将其构建到一个dll中,并在C#中导入函数:

运行此操作时,我得到以下输出:

初始化成功

我很困惑。有什么想法吗?

bool
是一种可怕的本地类型。每个人都有自己的方式。在C语言中, <代码>的默认互操作映射到<代码>布尔O/C++ > C++类型,它处理的值与您的代码不同。
您需要使用
[return:marshallas(UnmanagedType.I1)]
来指定正确的编组,并且不要忘记使用C调用约定。

哦,天哪。谢谢
using System;
using System.Runtime.InteropServices;

namespace Test
{
    class TestDll
    {
        [DllImport( "dlltest_d" )]
        public static extern bool init();
    }

    class Program
    {
        static void Main( string[] args )
        {
            if( !TestDll.init() )
            {
                Console.WriteLine( "init failed" );
                return;
            }
            Console.WriteLine( "init succeeded" );
        }
    }
}