为什么我的 dllimport 函数总是 return 为真?

Why does my dllimport function always return true?

关于从管理不善的 C++ dll 中导出的函数,我遇到了一个奇怪的问题,我在 C# 代码中使用它:无论我如何 return 在 C++ 中。我缩小范围并得到一个包含以下代码的 C++ 文件:

#ifdef __cplusplus
extern "C" {
#endif

    __declspec(dllexport) bool init()
    {
        return false;
    }

#ifdef __cplusplus
}
#endif

我将其构建到一个 dll 中并在 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" );
        }
    }
}

当我运行这个时,我得到以下输出:

init succeeded

我很纳闷。有什么想法吗?

bool 可怕的 原生类型。每个人都按照自己的方式去做。在 C# 中,bool 上的默认互操作映射到 BOOL C++ 类型,它处理与 bool.

不同的值

您需要使用 [return:MarshalAs(UnmanagedType.I1)] 指定正确的编组,并且不要忘记使用 C 调用约定。