自定义序列化4 (MFC调用C#的.dll)

CLR:CLR常用简写词语,CLR是公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。

MFC调用C#的.dll时的配置方式:

一、使用 /clr 编译 MFC 可执行文件或规则 DLL

1、打开“项目属性”对话框,方法是右键单击“解决方案资源管理器”中的项目并选择“属性”。

2、展开“配置属性”旁边的节点并选择“常规”。在右侧窗格中的“项目默认值”下,将“公共语言运行库支持”设置为“公共语言运行库支持 (/clr)”。

3、在相同的窗格中,确保将“MFC 的使用”设置为“在共享 DLL 中使用 MFC”。

4、在“配置属性”下,展开“C/C++”旁边的节点并选择“常规”。请确保将“调试信息格式”设置为“程序数据库 /Zi”(而不是“/ZI”)。

5、在“配置属性”下,选择“C/C++”,然后选择“代码生成”。请确保将“运行时库”设置为“多线程调试 DLL (/MDd)”或“多线程 DLL (/MD)”之一。

image

image

image

二、在代码引用需要的dll

#using <mscorlib.dll>

#using "DownloaFiles.dll" //换成需要的dll文件

using namespace System;

using namespace CGistarMath;//换成dll中类所使用的namespace

namespace: 名字空间
我想说的跟一楼的大哥说的差不多,不过需要补充一下
--如果你学过Java的话或许他的话你能看懂,但没学过的话,我还有一个更好的解释
namespace相当于windows操作系统中的文件夹,因为现在的程序大多都是大项目
或是代码不是一个人来完成的,难免会有变量声明时出现重名的现象,
比如程序员A定义了一个变量x程序员B也定义了一个x,
这时为了精确定位是哪个x用namespace加以限制就可以了,
比如A的x在一个叫 proA的名字空间里,
B的在proB的名字空间里那么对x定位时可以直接用proB::x或proA::x来表示具体的x,
是不是和windows里的c:programe files和d:programe files很相似呢,就这个原理啦~
相当于java里面的包。
 

三、在dll函数调用代码前加入#pragma managed

#pragma unmanaged

这是manage和unmanage混合编程在MFC下的一种实现方式。

以下是我自己碰到的问题的总结:

当我在声明一个变量的时候,是在.H文件的类里面声明: CGistarMath^ CSPro;

但是编译的时候会出现这个错误:

error C3265: 无法声明托管“CSPro”(在非托管“CMathCPPDlg”中) 

不能声明全局或静态变量,也不能声明引用 gc 堆中对象的本机类型成员

因此,我只能讲CGistarMath^ CSPro修改成 CGistarMath^ CSPro = gcnew CGistarMath();并且放入函数的实现当中,才将该问题解决,但是有个缺点就是需要使用到该DLL的函数都要自己生成一个对象,比较麻烦,也容易造成资源浪费。

原文地址:https://www.cnblogs.com/zhuxuekui/p/3516787.html