• C++ Call C#


    1、方法一:非托管C++ --> 托管C++ --> C#

        因为非托管C++缺乏一些运行时的类库支持,所以需要借助于托管C++做一个wrapper的活。 

    • 首先完成C#的开发,此时我们创建的是一个C#的动态链接库的项目
    namespace CSharp
    {
        public class program
        {
            public void run() {
                 Console.WriteLine("CSharp is running");
            }
        }
    }
    • 托管C++编写

    接下来就是托管C++的编写了,同样的,我们先创建一个动态链接库。
    而后再进行C++项目的配置,如下所示
    属性设置

    记得勾选公共语言运行时支持(/clr)这一选项,下面的目标框架版本根据你的C#版本进行填写即可
    接着在引用中添加我们刚刚编写好的C#动态链接库,在引用的浏览中找到C#动态链接库的路径,添加进去即可。
    下面是我们的C++代码

    #include "stdafx.h"
    #include "mc.h"
    #using "../demon/bin/Debug/cswcf.dll"
    using namespace cswcf;
    
    extern "C" __declspec(dllexport) void run() {
        program ^a = gcnew program();
        a->run();
    }

    注意这里需要使用using引用到我们的C#DLL,再使用C#中的命名空间。

    2、方法二:COM方式

    这种调用方式就是将dll转换成类com组件的方式调用。

    直接看方法:C++ 调用C#dll不是直接调用dll, 而是调用一个转变后的文件:.tlb文件的支持

    tlb文件:com类型库文件,它包含接口相关信息。在需要使用对应com类的模块里,通过"#import xxx.tlb"来调用。

    eg: 在C++代码中使用: #import "../../out/debug/TGPDFSignLib.tlb"

    这个.tlb文件会对应的生成tgpdfsignlib.tli 和 tgpdfsignlib.tlh两个文件。 

    在VC下#import "TGPDFSignLib.tlb" no_namespace;编译后产生TGPDFSignLib.tlh和TGPDFSignLib.tli两个文件,不生成namespace,如果没有no_namespace,则生成的内容都在namespaceTGPDFSignLib中。如果dll中含有tlb资源,则也可以使用#import "xxx.dll"来生成tlh和tli文件。一般的c++ dll不能使用#import "xxx.dll"。

    那么tlh、tli文件是什么?

    tlh、tli文件是vc++编译器解析tlb文件生成的标准c++文件。因为tlb并不是C++标准的东西,有必要把它们翻译成标准的C++类型,使得C++开发者可以使用。tlh相当于类型申明(头文件),tli相当于定义实现(CPP文件,inline)。

    当写到这里时所有的调用已经完成,你已经可以通过这种方法调用C#dll了。

    但是有一个问题,我们需要通过.tlb文件调用,那么.tlb文件从哪来的呢???

    生成.tlb文件一般有2种方法:

    1)  在工程编译时同步互操作注册生成文件。

    在vs中C#项目,选择项目属性,打开属性配置页,生成页中选择为com互操作注册复选框,在编译时会同时生成。

    eg:vs2013中

     

    2)  在命令框中注册dll生成。

    直接将regasm.exe文件拷贝到dll目录方便。

    打开cmd,选择管理员权限运行。cd到dll所在目录, 输入命令:

    regasmTGPDFSignLib.dll /tlb

    运行,注册成功,即可生成.tlb文件。

    注: 请注意版本的对应,也就是你不能用.net2.0的regasm.exe去注册.ne t4.0的dll.如果这样或报错:RegAsm error: Failed to load 'XXXXX.dll' because it is not a valid.Net assembly。

    每个版本都有一个对应的regasm.exe,2.0就用2.0的注册,4.0用4.0的注册。

  • 相关阅读:
    寻找我编程道路的明灯
    Torque2D MIT 学习笔记(7) TAML的使用
    Torque2D MIT 学习笔记(4) 脚本语法(2)
    C++输入/输出流
    设计模式之命令模式
    设计模式之策略模式
    Torque2D MIT 学习笔记(11) 资源管理(3)
    C++文件处理
    Torque2D MIT 学习笔记(2) 目录结构
    设计模式之观察者模式
  • 原文地址:https://www.cnblogs.com/jshchg/p/12900660.html
Copyright © 2020-2023  润新知