• 自定义序列化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的函数都要自己生成一个对象,比较麻烦,也容易造成资源浪费。

  • 相关阅读:
    [转]Nginx配置信息详解
    [转]浅谈Nginx负载均衡和F5的区别
    [转]MySQL中datetime和timestamp的区别及使用
    理解MyCat分库分表
    理解秒杀系统
    [转]设计模式之桥接模式
    [转]MySQL查询语句执行过程详解
    两步完美解决 androud 模拟器太慢的问题
    android hook 框架 xposed 如何实现挂钩
    android hook 框架 xposed 如何实现注入
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3516787.html
Copyright © 2020-2023  润新知