首页 / C# / 如何从c#调用C dll导出函数
如何从c#调用C dll导出函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何从c#调用C dll导出函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1979字,纯文字阅读大概需要3分钟。
内容图文
![如何从c#调用C dll导出函数](/upload/InfoBanner/zyjiaocheng/828/1c6d22b8d5c247eda2e0c3523bac2236.jpg)
这是我第一次尝试将c#与非托管C混合使用,所以这可能是一个非常简单的问题,但我不明白.
我需要将一些函数从C dll调用到C#代码中.这是dll项目的代码:
.h文件:
#pragma once
#include <iostream>
#if defined FIRSTDLL_EXPORTS
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif
extern "C"
{
DECLDIR int Add( int a, int b );
DECLDIR void Function( void );
}
.cpp文件
#include "stdafx.h"
#include "myFct.h"
#include <iostream>
extern "C"
{
DECLDIR int Add( int a, int b )
{
return( a + b );
}
DECLDIR void Function( void )
{
std::cout << "DLL Called!" << std::endl;
}
}
我为debug和releas编译了这个,并将它复制到我的C#项目的debug文件夹中.这两个版本都没有用.
这是c#代码:
[DllImport("firstDLL.Dll")]
public static extern int Add(int a, int b);
var cyu = Add(3, 5);
当我尝试运行时,我得到了
“Managed Debugging Assistant ‘PInvokeStackImbalance’ has detected a problem in ‘C:\Program Files\Microsoft Office\Office14\WINWORD.EXE’.
Additional Information: A call to PInvoke function ‘MyAddin!MyAddin.ThisAddIn::Add’ 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.”
但是我看到签名是一样的.我错过了什么?
谢谢!
最佳答案:
DLLImport的默认调用约定是stdcall,但是C代码的默认值是cdecl.您看到的错误消息是调用约定不匹配时显示的内容.对于这两个调用约定,参数堆栈清理要求是不同的,并且P / Invoke marshaller检测并报告它.
修复方法是使您的调用约定匹配.
例如,您可以像这样更改P / Invoke:
[DllImport("firstDLL.Dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a, int b);
另一种选择是改变你的C:
#if defined FIRSTDLL_EXPORTS(returntype)
#define DECLDIR __declspec(dllexport) returntype __stdcall
#else
#define DECLDIR __declspec(dllimport) returntype __stdcall
#endif
显然你应该只做其中一个.如果你同时改变C#和C,你会反过来遇到同样的问题!
如果我是你,我会将C代码保留为cdecl并更改C#以匹配.
内容总结
以上是互联网集市为您收集整理的如何从c#调用C dll导出函数全部内容,希望文章能够帮你解决如何从c#调用C dll导出函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。