C# 在C中调用C DLL时出现问题#
我目前正试图从C调用一个在C中生成的方法# C代码如下所示:C# 在C中调用C DLL时出现问题#,c#,c,dllexport,C#,C,Dllexport,我目前正试图从C调用一个在C中生成的方法# C代码如下所示: extern "C" int addSum(int a, int b) { return a*b; } extern "C" int getCount() { return 12; } [DllImport("mydll.dll", SetLastError=true)] private static extern int addSum(IntPtr a, IntPtr b); [DllImport("my
extern "C" int addSum(int a, int b)
{
return a*b;
}
extern "C" int getCount()
{
return 12;
}
[DllImport("mydll.dll", SetLastError=true)]
private static extern int addSum(IntPtr a, IntPtr b);
[DllImport("mydll.dll", SetLastError = true)]
private static extern int getCount();
public static int mySum(int a, int b)
{
return suma(a, b);
}
public static int getMyCount()
{
return getCount();
}
C代码如下所示:
extern "C" int addSum(int a, int b)
{
return a*b;
}
extern "C" int getCount()
{
return 12;
}
[DllImport("mydll.dll", SetLastError=true)]
private static extern int addSum(IntPtr a, IntPtr b);
[DllImport("mydll.dll", SetLastError = true)]
private static extern int getCount();
public static int mySum(int a, int b)
{
return suma(a, b);
}
public static int getMyCount()
{
return getCount();
}
代码返回正确的值,但我得到以下错误:
addSum'使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配
对这个问题有什么建议吗
谢谢您不需要使用IntPtr作为参数。定义方法签名时可以直接使用整数值:
[DllImport("mydll.dll", SetLastError = true)]
public static extern int addSum(int a, int b);
[DllImport("mydll.dll", SetLastError = true)]
public static extern int getCount();
然后直接调用函数:
int result = SomeClass.addSum(3, 4);
int count = SomeClass.getCount();
除了取决于目标平台的数据类型(可能是问题,也可能不是问题)之外,您可能还需要查看调用约定。正是调用约定决定了负责堆栈清理的其他事物,以及参数在堆栈上推送或分配给寄存器的顺序等 C代码通常使用
cdecl
调用约定
[DllImport("mydll.dll",
SetLastError=true,
CallingConvention=CallingConvention.Cdecl)]
为什么要传递
int
的IntPtr
?我使用了完全相同的示例。它正在工作,但我得到以下通知:addSum'使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配,使您的函数\uu stdcall
。不,它不起作用。如果我在C#控制台应用程序上处于调试模式,我会收到该通知。如果我调用exe,它是OK的。有没有从C dll创建COM对象的方法?