首页 > 编程语言 >VC.dll相关及其C#交互

VC.dll相关及其C#交互

时间:2023-01-05 15:37:09浏览次数:44  
标签:MFC C# 调用 导出 dll VC 加载


方法步骤:

1.新建工程:

   如果需要MFC的支持,可以选择MFC AppWizard(dll)工程类型,如果不需要,可以选择Win32(dll).

2.编写内部代码:

   该部分过程与建立一般的exe文件大同小异,在此不再赘述。

3.编写关键代码:

   在关键的头文件中添加dll库导出接口:其中导出类的声明之前要加注宏定义AFX_EXT_CLASS;导出函数则在生命之前添加extern "C" __declspec(dllexport)的字样。

4.引入相应的Demo程序

Demo程序在引用dll时分为静态和动态两种:

1>静态加载:

   将相应的dll文件放入Demo.exe的目录下,将dll编译生成的lib文件和包含有导出接口的关键头文件放入程序的编译目录下。

   而后在用到库函数的地方#include关键头文件,在Project---->setting---->link中添加相应的lib文件名称。执行即可。

2>动态加载:

VC中.dll文件的动态加载方法:

 

//initCommDll()必须在调用扩展函数前调用

//mydllfun为示例函数


///函数调用定义,函数参数类型,返回类型应该与dll中一致
typedef DWORD (_stdcall MYDLLFUN)(mytype myparameter);


//函数指针声明

static HINSTANCE hmydll;

static MYDLLFUN *mydllfun;


void initCommDll()
{
hmydll=::LoadLibrary("mydll.DLL");
VERIFY(mydllfun=(MYDLLFUN *)::GetProcAddress(hmydll,"mydllfun"));
}

另附:

C#中动态调用.dll文件的方法:


C#惯于利用反射进行动态加载和调用.



Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll


Assembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名



加载dll后,需要使用dll中某类.



Type type=ass.GetType(“TypeName”);//利用类型的命名空间和名称获得类型



需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略



Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型



调用类型中的某个方法:



需要首先得到此方法



MethodInfo mi=type.GetMethod(“MehtodName”);//通过方法名称获得方法



然后对方法进行调用,多态性利用参数进行控制



mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值

 



5.注意:如果想实现该dll文件的跨平台调用,比如C#调用,则其类型必须是Win32以及MFC中的静态dll,动态dll是不可调用的。

 

以下为C#调用非托管.dll方法:

 

 


引入相应的命名空间:

using System.Runtime.InteropServices;

引入dll文件并声明导出函数:

[DllImport("name.dll")]
private static extern style name(/*函数参数表*/);

注意:引入的dll文件必须是VC中的Win32dll或者MFC静态dll,MFC规则dll和MFC扩展dll均是不可用的!!; 除此之外,MFC的三种dll中的前两种只能用于导出全局方法,而第三种只能用于导出类。

随后的调用便和C#调用托管dll文件相同。

直接引入非托管的dll文件,之所以会找不到程序的入口,就是因为缺少了声明导出函数这至为关键的一步。

标签:MFC,C#,调用,导出,dll,VC,加载
From: https://blog.51cto.com/kenkao/5991236

相关文章

  • C# Windows 窗体的.Net 框架绘图技术
     当编写一个典型的Windows窗体​​程序​​时,窗体和控件的绘制、效果等操作是不需要特别加以考虑的。这是为什么呢?因为通过使用​​.Net​​本文针对那些Windows窗......
  • 代码随想录day8 LeetCode 344 反转字符串 541反转字符串II 剑指 Offer 05. 替换空格
    344反转字符串https://leetcode.cn/problems/reverse-string/双指针classSolution{public:voidreverseString(vector<char>&s){intleft=0;intri......
  • Apache Tomcat的安装与测试
    为了unity的webgl发布和测试,我安装了tomcat。距离上一次使用Tomcat还是很久很久以前的事情了。简单记录一下吧。我发现webgl的发布问题超级多,尤其是2020版本的。看来接下来......
  • 前端调试工具(ionic)
    一、调试工具介绍1、firefox插件WebDeveloper1.1.6(最新版本,中文版)主要用于html、css、js的查看和编辑;推荐指数:Firefox上开发和调试web站点的不二之选。Webdeveloper......
  • 脱模剂 chem trend | 肯天脱模剂品牌大揭秘!
    我们都知道每家公司旗下都有众多优秀的品牌,品牌是人们对一个企业及其产品售后服务、文化价值的一种评价和认知它是一种信任。肯天当然也不例外,我们众多品牌只有一个共同的目......
  • 【AGC】在云调试删除应用无法再安装问题
    问题背景:俄罗斯cp反馈在AGC平台使用云调试功能出现了问题。复现步骤:安装应用程序->卸载应用程序(长按“删除”按钮)->再次尝试安装。之后收到信息:安装成功。但无论如何......
  • JavaScript事件触发列表与解说
    一般事件事件浏览器支持描述onClickHTML:2|3|3.2|4Browser:IE3|N2|O3鼠标点击事件,多用在某个对象控制的范围内的鼠标点击onDblClickHTML:2|3|3.2|4Browser:IE4|N4|O鼠标......
  • 【AGC】在云调试删除应用无法再安装问题
    问题背景:俄罗斯cp反馈在AGC平台使用云调试功能出现了问题。复现步骤:安装应用程序->卸载应用程序(长按“删除”按钮)->再次尝试安装。之后收到信息:安装成功。但无论如何,已......
  • ubuntu下docker及打deb包
    Bash函数-BashShell教程#文件测试-e文件存在-a文件存在这个选项的效果与-e相同.但是它已经被弃用了,并且不鼓励使用-ffile是一个regular文件(不是目录或者设备文......
  • gcc内置原子操作__sync_系列函数解析
    gcc内置原子操作__sync_系列函数解析gcc4.1.2版本之后,对X86或X86_64支持内置原子操作。就是说,不需要引入第三方库(如pthread)的锁保护,即可对1、2、4、8字节的数值或指针类......