Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中调用C DLL时出现问题#_C#_C_Dllexport - Fatal编程技术网

C# 在C中调用C DLL时出现问题#

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

我目前正试图从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("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对象的方法?