C# 中的 C++ DLL 返回 -858993460



我有一个 C++ (MSVS 2010( DLL 从 MS 给出的示例中给出为:

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);  
}  
}  

已编译 DLL 的dumpbin导出以下信息:

1    0 00011078 ?Add@Functions@MathLibrary@@SANNN@Z = @ILT+115(?Add@Functions@MathLibrary@@SANNN@Z)
2    1 000110B9 ?AddMultiply@Functions@MathLibrary@@SANNN@Z = @ILT+180(?AddMultiply@Functions@MathLibrary@@SANNN@Z)
3    2 00011005 ?Multiply@Functions@MathLibrary@@SANNN@Z = @ILT+0(?Multiply@Functions@MathLibrary@@SANNN@Z)

因此,我编写了 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 函数的参数如何。 任何人都可以建议此输出代表什么,以及如何修复我的调用代码?

-858993460

以十六进制表示0xCCCCCCCC。 这是 C/C++ 编译器Microsoft用于调试版本中未初始化变量的值。 我最初的怀疑是从 DLL 返回的值是一个从未实际分配的变量。

此外,C# 代码声明函数正在使用并返回整数,但实际C++代码实现使用双精度值这一事实也可能是问题所在。 返回整数的 MSVC 函数通常会将结果填充到 EAX 寄存器中,但我怀疑返回浮点值的函数并非如此。这也许可以解释它。但充其量,这是"未定义的行为"。

我怀疑您在 C# 代码中真正需要的是 Add 的声明:

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

最新更新