为什么我的dllimport函数总是返回true?

时间:2016-06-14 10:48:24

标签: c# c++ dllimport dllexport

关于从错误管理的C ++ dll导出的函数我遇到了一个奇怪的问题,我使用C#代码:C#中收到的返回bool总是正确的,无论我在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成功

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

1 个答案:

答案 0 :(得分:1)

bool可怕的原生类型。每个人都以自己的方式行事。在C#中,bool上的默认互操作映射到BOOL C ++类型,该类型处理的值不同于bool

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