iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c#调用c语言dll需要注意的地方
  • 707
分享到

c#调用c语言dll需要注意的地方

2024-04-02 19:04:59 707人浏览 安东尼
摘要

目录一、将C#工程和C的dll工程放在同一个解决方案下,这样就可以实现联动调试,直接从C#中进入C的dll函数里。注意:每次更改dll中的代码后都必须重新生成dll。另,C#与C中有

一、将C#工程和C的dll工程放在同一个解决方案下,这样就可以实现联动调试,直接从C#中进入C的dll函数里。注意:每次更改dll中的代码后都必须重新生成dll。另,C#与C中有几种变量类型不对应,注意声明时的区分。

语言 C# C
类型 long long long/__int64
byte/Byte unsigned char
char

wchar_t

UInt32 size_t

二、dll工程中头文件加入以下代码:


// 此代码为了方便头文件在dll工程和调用该dll的工程中重复利用
// 为了方便其他使用者,建议dll开发者定义TESTDLL宏
#ifdef  TESTDLL
#define DLLapi _declspec(dllexport)
#else
#define DLLAPI _declspec(dllimport)
#endif
 
// 此代码为了保证使用C编译器编译代码,防止函数名出现其他后缀
 
#ifdef __cpluscplus
extern "C" {
#endif
 
// 插入所需导出的代码,例如:
int DLLAPI testdll();
 
#ifdef __cpluscplus
}
#endif
 

三、dll工程中源文件加入以下代码(注意:该代码应该出现于上述头文件之前):


#define TESTDLL

四、C#工程中,需要调用dll函数的文件中加入以下代码:


// 导入testdll函数
[DllImport(@"../../../Debug/testdll.dll", EntryPoint = "testdll", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallinGConvention = CallingConvention.Cdecl)]
 
extern static int testdll();

第一个参数是dll文件所在地址,由于该dll与C#工程在同一个解决方案中因此可以写成上述形式;

EntryPoint, 函数的名称,可以不写,下面一行有声明;

SetLastError, 指示方法是否保留 Win32"上一错误";

CharSet, dll中字符串的表达方式,通常使用Ansi或者Unicode;该设置会将C#中的字符自动转换为设置的方式,例如上述设置会将工程中的字符串转换为Ansi字符;

ExactSpelling,指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配;

PreserveSig,指示方法的签名应当被保留还是被转换;

CallingConvention,调用惯例,通常C语言使用Cdecl方式CallingConvention,如果该值与dll中的调用方式不一致,通常会造成堆栈不平衡,导致PInvoke报错,该选项有如下几个值:

Cdecl 调用方清理堆栈。这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法。 
FastCall 不支持此调用约定。
StdCall 被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。 
ThisCall  第一个参数是 this 指针,它存储在寄存器 ECX 中。其他参数被推送到堆栈上。此调用约定用于对从非托管 DLL 导出的类调用方法。 
Winapi  此成员实际上不是调用约定,而是使用了默认平台调用约定。例如,在 windows 上默认为 StdCall,在 Windows CE.net 上默认为 Cdecl。 

以上就是c#调用c dll需要注意的地方的详细内容,更多关于c#调用c dll的资料请关注编程网其它相关文章!

--结束END--

本文标题: c#调用c语言dll需要注意的地方

本文链接: https://www.lsjlt.com/news/122117.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c#调用c语言dll需要注意的地方
    目录一、将C#工程和C的dll工程放在同一个解决方案下,这样就可以实现联动调试,直接从C#中进入C的dll函数里。注意:每次更改dll中的代码后都必须重新生成dll。另,C#与C中有...
    99+
    2024-04-02
  • c#调用c语言dll需要注意的事项有哪些
    小编给大家分享一下c#调用c语言dll需要注意的事项有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、将C#工程和C的dll工程放在同一个解决方案下,这样就...
    99+
    2023-06-14
  • c语言函数的递归调用要注意哪些事项
    在C语言中,递归调用函数时需要注意以下几个事项:1. 递归的终止条件:递归函数需要定义一个终止条件,当满足这个条件时,递归调用将停止...
    99+
    2023-09-22
    c语言
  • c#异步方法调用要注意什么
    在调用异步方法时,需要注意以下几点: 使用async和await关键字:异步方法需要使用async关键字进行声明,并在需要等待异...
    99+
    2024-04-02
  • C语言转换类型时需要注意哪些事项
    在C语言中,类型转换时需要注意以下事项: 数据可能丢失:当将一个大范围的数据类型转换为一个小范围的数据类型时,可能会导致数据丢失...
    99+
    2024-03-15
    C语言
  • 用Go语言编写Apache接口,有哪些需要注意的地方?
    随着互联网应用越来越普及,Web服务器也变得越来越重要。Apache是最常用的Web服务器之一,它支持大量的模块和插件,可以满足不同的需求。在本文中,我们将探讨如何用Go语言编写Apache接口,并介绍一些需要注意的地方。 一、Go语言和A...
    99+
    2023-10-05
    函数 apache 接口
  • Android LiveData使用需要注意的地方
    目录1.回调通知2.数据倒灌3.事件包装关于LiveData是什么以及基本使用方式,请参考官方文档:developer.android.com/topic/libra… 简单来说,L...
    99+
    2024-04-02
  • c#调用c++的DLL的实现方法
    目录1.采用托管的方式进行调用,就和正常调用c#的dll一样2.非托管的方式进行调用C#是托管型代码,创建的对象会自动回收。C++是非托管型代码,创建的对象需要手动回收(有时不手动回...
    99+
    2024-04-02
  • C#中使用CLR需要注意什么
    这篇文章主要为大家展示了“C#中使用CLR需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中使用CLR需要注意什么”这篇文章吧。1、C# CLR之foreach的性能问题 fore...
    99+
    2023-06-17
  • C语言中使用break要注意哪些事项
    在C语言中,使用break语句时需要注意以下几点事项:1. break只能用于循环语句和switch语句中,用来跳出当前循环或swi...
    99+
    2023-10-12
    C语言
  • c语言scanf字符串使用要注意什么
    在使用scanf函数读取字符串时,需要注意以下几点:1. 需要使用"%s"格式控制符来读取字符串,"%s"后面不能有空格。2. 输入...
    99+
    2023-09-21
    c语言
  • 使用c语言常量要注意哪些事项
    使用C语言常量时需要注意以下事项: 常量的值不能被修改。一旦常量被定义后,它的值就不能被修改。 常量的命名应该符合命名规范,...
    99+
    2023-10-23
    c语言
  • 浅谈使用setBounds()方法需要注意的地方
    第一点,使用这个方法,component的x,y坐标是相对于它的父容器的。如果不注意,x、y的值,比父容器的宽度和高度还大的话,就容易造成加进去组件但是显示不出来的问题。我就是遇到这么一个问题,现在才想明白。第二点,这个方法只有在父容器的布...
    99+
    2023-05-31
    setbounds 方法
  • IE8 Beta 1需要注意的地方地方是什么
    IE8 Beta 1需要注意的地方地方是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前两天特意装了一下IETester,用以方便测试,装好后使用发现IE8有两个地方需要大...
    99+
    2023-06-08
  • C语言宏定义使用要注意哪些事项
    在使用C语言宏定义时,需要注意以下事项:1. 保持宏定义的简洁和清晰:宏定义应该尽可能简洁明了,避免过长或复杂的宏定义,以提高代码的...
    99+
    2023-10-11
    C语言
  • C# 文件安全管理需要注意的
    目录一.DotNet文件目录常用操作:   1.文件常规操作:    2.目录常规操作:二.DotNet文件目录访问管理: &nbs...
    99+
    2024-04-02
  • c语言运算符使用要注意哪些事项
    算术运算符要注意数据类型的匹配,例如整数相除可能会取整,浮点数相除才能得到精确的结果。 注意逻辑运算符的短路特性,即只要找到一个条...
    99+
    2024-04-09
    c语言
  • C#异步使用需要注意的几个问题
    目录一、异步模型的基本概述二、C#异步使用需要注意的几个问题三、CancellationToken 结构体1.手动取消2.利用方法取消,抛出异常3. 传参数取消4.手动触发事件取消任...
    99+
    2024-04-02
  • c语言二维数组赋值要注意什么
    在给二维数组赋值时,需要注意以下几点: 索引顺序:二维数组是一个由多个一维数组组成的数组,每个一维数组代表二维数组的一行或一列。...
    99+
    2024-03-08
    c语言
  • c语言声明变量要注意哪些事项
    在C语言中声明变量时需要注意以下事项:1. 声明变量前要先确定变量的类型,例如整型、浮点型、字符型等。2. 变量名必须以字母或下划线...
    99+
    2023-09-08
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作