为C#制作C DLL

为C#制作C DLL,第1张

概述我做了一个非常简单的Dll: extern "C"{ __declspec(dllexport) int Try(int v) { return 10 + v; }} 然后我想在我的C#应用​​程序中使用它: class Program{ [DllImport("TestLib.dll")] public static extern int Try(int 我做了一个非常简单的Dll:

extern "C"{  __declspec(dllexport) int Try(int v)  {    return 10 + v;  }}

然后我想在我的C#应用​​程序中使用它:

class Program{    [Dllimport("Testlib.dll")]    public static extern int Try(int v);    static voID Main(string[] args)    {        Console.Writeline("Wynik: " + Try(20));        Console.Readline();    }}

它一直在工作,直到我尝试过参数.现在我在运行时遇到以下错误:

A call to PInvoke function
‘ConsoleApplication2!ConsoleApplication1.Program::Try’ has unbalanced
the stack. This is likely because the managed PInvoke signature does
not match the unmanaged target signature. Check that the calling
convention and parameters of the PInvoke signature match the target
unmanaged signature.

我不知道问题出在哪里.

解决方法 您收到的错误消息确实包含了一个很好的建议:

Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

您应该在两侧指定相同的调用约定(C dll和C#程序集).在C中,您可以通过使用__cdecl,__ stdcall等之一预先添加函数声明来指定它.

extern "C"{  __declspec(dllexport) int __stdcall Try(int v)  {    return 10 + v;  }}

在C#端你用Dllimport属性指定它,默认的是CallingConvention.StdCall,它对应于C中的__stdcall,所以看起来你在C端有一个__cdecl.要解决此问题,请在DLL中使用__stdcall,如上所示,或者在C#中使用CDecl,如下所示:

class Program{    [Dllimport("Testlib.dll",CallingConvention=CallingConvention.Cdecl)]    public static extern int Try(int v);    static voID Main(string[] args)    {        Console.Writeline("Wynik: " + Try(20));        Console.Readline();    }}
总结

以上是内存溢出为你收集整理的为C#制作C DLL全部内容,希望文章能够帮你解决为C#制作C DLL所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存