vs2010 C#调用C++的DLL问题 未能添加对xx.dll的引用
我一开始用记事本写C++文件然后用cl和link产生的dll出现这种问题之后看了好多网上的解释有说是版本问题然后我有用VS2010自带的C++写同样的程序产生的DLL也同...
我一开始用记事本写C++文件 然后用cl 和 link 产生的dll 出现这种问题 之后看了好多网上的解释 有说是版本问题 然后我有用VS2010自带的C++写同样的程序 产生的DLL 也同样出现这种问题。 求大神解释,非常感谢,我把我写的C++也程序粘出来,FYI。
//输入输出字符串传递测试
extern "C" __declspec(dllexport) int TCharPara(char *in, int len, char *out)
{
memcpy(out, in, len);
return 0;
}
部分C#代码如下:
using System.Runtime.InteropServices;
namespace CallDll
{
[StructLayout(LayoutKind.Sequential)]
public struct _XY
{
public int x;
public int y;
};
public class TCallCDll
{
[DllImport("dll.dll")]
//iin: 输入参数
//oout: 输出参数
public static extern int TCharPara(String iin, int len, StringBuilder oout);
//调用
TCallCDll.TStructPara(ref xy);
}
}
完全不用担心语法问题 调试都行 就是运行 找不到方法。 展开
//输入输出字符串传递测试
extern "C" __declspec(dllexport) int TCharPara(char *in, int len, char *out)
{
memcpy(out, in, len);
return 0;
}
部分C#代码如下:
using System.Runtime.InteropServices;
namespace CallDll
{
[StructLayout(LayoutKind.Sequential)]
public struct _XY
{
public int x;
public int y;
};
public class TCallCDll
{
[DllImport("dll.dll")]
//iin: 输入参数
//oout: 输出参数
public static extern int TCharPara(String iin, int len, StringBuilder oout);
//调用
TCallCDll.TStructPara(ref xy);
}
}
完全不用担心语法问题 调试都行 就是运行 找不到方法。 展开
2个回答
展开全部
您好。
试试以下方法:
不添加引用,在源码头部添加:
using System.Runtime.InteropServices;
然后在类中声明方法:
[DllImport("dll.dll")]
extern 函数返回类型 函数名(参数);
试试以下方法:
不添加引用,在源码头部添加:
using System.Runtime.InteropServices;
然后在类中声明方法:
[DllImport("dll.dll")]
extern 函数返回类型 函数名(参数);
更多追问追答
追问
你说的我都用了
对 PInvoke 函数“CallDll!CallDll.TCallCDll::TCharPara”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
追答
楼上回答正确,使用[DllImport("dll.dll", EntryPoint="TCharPara", CallingConvention=CallingConvention.Cdecl)]
另外C的char*参数应转换为C#的System.String,也就是说方法应该声明为
public static extern int TCharPara(String iin, int len, String oout);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为调用C的DLL的时候根本不是这样引用的……
[DllImport("wtf.dll", EntryPoint="TCharPara", CallingConvention=CallingConvention.Cdecl)]
extern static int TCharPara(IntPtr pIn, int pLen, IntPtr pOut);
其中IntPtr也可以改为 ref xxxx(某种结构体类型)
或者 byte[]、int[] 等数组(此时类似Array.Copy吧?大概
[DllImport("wtf.dll", EntryPoint="TCharPara", CallingConvention=CallingConvention.Cdecl)]
extern static int TCharPara(IntPtr pIn, int pLen, IntPtr pOut);
其中IntPtr也可以改为 ref xxxx(某种结构体类型)
或者 byte[]、int[] 等数组(此时类似Array.Copy吧?大概
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询