IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C#封装动态库提供给C++调用 -> 正文阅读

[C++知识库]C#封装动态库提供给C++调用

1, 首先封装一个C# Dll, 即创建工程为C#类库;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace MyCharpDll
{
? ? [ComVisible(true)]
? ? [Guid("0CE96C54-CC5F-47A6-BD21-C2635CEDC2D8")]
? ? public interface IMyCSharp?? ?// 接口
? ? {
? ? ? ? [DispId(1)]
? ? ? ? string CombinString(string str1, string str2, out string outstr);
? ? }

? ? [ComVisible(true)]
? ? [Guid("56209E46-A605-492F-AA50-9D6608116181")]
? ? [ClassInterface(ClassInterfaceType.None)]
? ? public class MyCSharp : IMyCSharp // 实现类继承接口
? ? {
? ? ? ? public string CombinString(string str1, string str2, out string outstr)
? ? ? ? {
? ? ? ? ? ? outstr = str1 + str2;
? ? ? ? ? ? return outstr;
? ? ? ? }
? ? }
}

1) 工程->属性->应用程序->程序集信息... ?弹出对话框, 勾选 "使程序集COM可见";
2) 工程->属性->生成 ?勾选 "为COM互操作注册"; (在其他机器上运行, 则要手动将dll注册为COM)
(3) 在这里我们通过regasm.exe生成注册表文件供使用者将dll注册为
COM组件(其实就是把GUID导入注册表)。
脚本文件如下:
regasm E:\UnmanagecodeCallManagecode\CalcClass\CalcClass\bin\Debug\CalcClass.dll
regasm E:\UnmanagecodeCallManagecode\CalcClass\CalcClass\bin\Debug\CalcClass.dll /tlb: CalcClass.tlb
regasm E:\UnmanagecodeCallManagecode\CalcClass\CalcClass\bin\Debug\CalcClass.dll /regfile: CalcClass.reg
注意使用的regasm.exe版本与开发dll所使用的.NET Framework版本最好保持一致。
运行该脚本生成CalcClass.reg文件。在其他机器上运行该文件,即可注册该COM组件,才能正常使用

注册DLLD脚本
@echo off
@echo on
RegAsm.exe ?LanJiaoSharpDll.dll
pause

注销DLL脚本
@echo off
@echo on
RegAsm.exe ?LanJiaoSharpDll.dll /u
pause


2, VC++调用C# Dll

#include <iostream>
#include <string.h>
#import "MyCharpDll.tlb"
using namespace std;
using namespace MyCharpDll;

void main()
{
?? ?CoInitialize(NULL);
?? ?IMyCSharpPtr myCSharpPtr;
?? ?myCSharpPtr.CreateInstance(__uuidof(MyCSharp));
?? ?if (myCSharpPtr != NULL)
?? ?{
?? ??? ?char *pStr1 = "你好--";
?? ??? ?char* pStr2 = "欢迎光临";
?? ??? ?char szOut[256];
?? ??? ?BSTR temp;
?? ??? ?memset(szOut, 0, sizeof(szOut));
?? ??? ?myCSharpPtr->CombinString(_bstr_t(pStr1), _bstr_t(pStr2), &temp);
?? ??? ?strcpy_s(szOut, sizeof(szOut), _com_util::ConvertBSTRToString(temp));
?? ??? ?cout << szOut << endl;
?? ??? ?myCSharpPtr.Release();
?? ?}
?? ?else
?? ??? ?cout << "创建接口失败" << endl;
?? ?CoUninitialize();
}

3, VC对C# Dll再次封装

头文件:
#define CSharpDll_Export
#ifdef CSharpDll_Export
#define CSharpDllApi?? ?__declspec(dllexport)
#else
#define CSharpDllApi?? ?__declspec(dllimport)
#endif

extern "C" CSharpDllApi bool CombinString(char* pStr1, char* pStr2, char* pOut);

源文件:

#include "CSharpDll.h"
#include <string.h>
#import "MyCharpDll.tlb"
using namespace MyCharpDll;

bool CombinString(char* pStr1, char* pStr2, char* pOut)
{
?? ?bool bRet = false;
?? ?CoInitialize(NULL);
?? ?IMyCSharpPtr myCSharpPtr;
?? ?myCSharpPtr.CreateInstance(__uuidof(MyCSharp));
?? ?if (myCSharpPtr != NULL)
?? ?{
?? ??? ?BSTR temp;
?? ??? ?myCSharpPtr->CombinString(_bstr_t(pStr1), _bstr_t(pStr2), &temp);
?? ??? ?strcpy(pOut, _com_util::ConvertBSTRToString(temp));
?? ??? ?myCSharpPtr.Release();
?? ??? ?bRet = true;
?? ?}
?? ?else
?? ??? ?bRet = false;
?? ?CoUninitialize();
?? ?return bRet;
}


4, 外部调用

#include <stdio.h>
#include <STRING.H>
#include "CSharpDll.h"
#pragma comment(lib, "CSharpDll.lib") ?// 这时候只需 CSharpDll.dll 文件, 因为C# DLL已经注册为COM

void main()
{
?? ?char* pStr1 = "这是CSharp编写的DLL ";
?? ?char* pStr2 = "该DLL提供了一个字符创拼接函数";
?? ?char szOut[256];
?? ?memset(szOut, 0, sizeof(szOut));
?? ?if ( CombinString(pStr1, pStr2, szOut) )
?? ?{
?? ??? ?printf("调用成功: %s\n", szOut);
?? ?}
?? ?else
?? ??? ?printf("调用失败\n");
?? ?getchar();
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:12:56  更:2021-11-10 12:15:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:04:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码