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函数的参数如何。 任何人都可以建议这个输出代表什么,以及如何解决我的调用代码?
答
-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
什么是'Functions'的声明,也只是你的C++函数的调用约定?通常情况下,人们会为这些需要使用P/Invoke调用的函数执行'extern C'。 – Phil1970
另外,你的C#定义说'Add'需要两个'Int32'参数,但是你的C++代码说它需要两个'double'参数。 – Kyle