C++从C#DLL返回-858993460

问题描述:

我有一个C++(MSVS 2010)DLL从样品MS给出如下:C++从C#DLL返回-858993460

namespace MathLibrary 
{ 
    double Functions::Add(double a, double b) 
    { 
     return a + b; 
    } 
    double Functions::Multiply(double a, double b) 
    { 
     return a * b; 
    } 

    double Functions::AddMultiply(double a, double b) 
    { 
     return a + (a * b); 
    } 
} 

dumpbin已编译DLL导出下列信息:

 1 0 00011078 [email protected]@[email protected]@[email protected] = @ILT+115([email protected]@[email protected]@[email protected]) 
     2 1 000110B9 [email protected]@[email protected]@[email protected] = @ILT+180([email protected]@[email protected]@[email protected]) 
     3 2 00011005 [email protected]@[email protected]@[email protected] = @ILT+0([email protected]@[email protected]@[email protected]) 

所以我写C#代码(.NET框架4.5.2)来调用Add功能:

namespace ConsoleApplication5 
{ 
class Program 
{ 
    [DllImport(@"MathLib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "#1")] 
    public static extern int Add(Int32 a, Int32 b); 
    public unsafe static void Main() 
    { 
     int i = Add(1,3); 
     Console.WriteLine(i); 
     Console.ReadLine(); 
    } 
} 
} 

当我运行ŧ他的控制台应用程序始终输出

-858993460 

不管传递给Add函数的参数如何。 任何人都可以建议这个输出代表什么,以及如何解决我的调用代码?

+2

什么是'Functions'的声明,也只是你的C++函数的调用约定?通常情况下,人们会为这些需要使用P/Invoke调用的函数执行'extern C'。 – Phil1970

+2

另外,你的C#定义说'Add'需要两个'Int32'参数,但是你的C++代码说它需要两个'double'参数。 – Kyle

-858993460用十六进制表示的是0xCCCCCCCC。这是Microsoft C/C++编译器在Debug版本中对未初始化变量使用的值。我最初的怀疑是,从DLL返回的值是一个从未真正分配的变量。

此外,事实上,您的C#代码声明函数使用和返回整数,但实际的C++代码实现使用双打也可能是问题。 MSVC返回整数的函数通常将结果填充到EAX寄存器中,但我怀疑返回浮点值的函数并不是这种情况。这可能可以解释它。但充其量,这是“未定义的行为”。

我怀疑你真正需要的C#代码这个声明地址:

[DllImport(@"MathLib.dll", CharSet = CharSet.Ansi, CallingConvention = 
CallingConvention.Cdecl, EntryPoint = "#1")] 
    public static extern double Add(double a, double b); 
+0

谢谢。我是一个依靠自动装箱的受害者 - 自从我进入C++世界以来,已经很长时间了,你必须从字面上做所有事情;) – Black