c++ 非托管程序调用c#托管程序l的实现操作方式_未托管c++调用c#_余山水的博客-程序员秘密

技术标签: 学习  c语言  x  工作  非托管程序调用c#托管程序  错误代码-2146234341  

        最近,做产品开发,需要在非托管的c++程序调用c#的托管程序。经过试验,整理了一种简便方法,但该方法局限比较多,后面会推荐另外一个方式。现在先介绍该方法的操作步骤如下:

       1.创建c#的dll中接口的定义参看下面的示例。注意接口中的函数必须为静态的函数,输入参数只能有一个字符串类型,返回值必须为int,具体参看下面说明。

using System.IO;
using System.Xml;
using System.Data;
namespace CLRLib
{
    /// <summary>
    /// 此类为和c++交互的接口类,成员函数均为静态函数
    /// </summary>
    class cgCLRLibAccessAdapter
    {


        /// <summary>
        /// 测试
        /// </summary>
        /// <param name="szParam">标志参数</param>
        /// <returns>返回值</returns>
//  备注:接口函数只能为静态函数,返回值只能为Int,输入参数只能有一个字符串
        public static Int32 IsTest(String szParam)
        {
    int i= 2;
                return i;
}
     }
}

    2.定义了类cgCLRAccess用来操作访问c#类的函数。具体类的定义参看附件文件cgCLRAcess.h和cgCLRAcess.cpp。

文件cgCLRAcess.h:

#pragma once
#include "stdafx.h"
#include <MSCorEE.h>
//=========================================================================
//访问CLRDll的相关类
class cgCLRAccess
{
private:
CString m_szFileName;   //动态库文件全名
CString m_szClassName;  //c#类名称
ICLRRuntimeHost *m_pClrHost; //CLR运行时态宿主
CString m_szNetFrameVersion; //dll的目标FrameWork版本
public:
cgCLRAccess(CString fileName,CString className,CString netFrameVersion);
~cgCLRAccess();
//运行方法
int RunMethod(CString szMethodName,CString szParamString);
};

文件cgCLRAcess.cpp:

#include "StdAfx.h"
#include "cgCLRAccess.h"
#include <Windows.h>
#include <assert.h>
#include <Windows.h>
#include <MSCorEE.h>


using namespace std;


#pragma comment(lib,"mscoree.lib")
// ---------------------------------------------------------------
// 名称: cgCLRAccess
// 功能: 构造函数
// 变量: [in] fileName -- dll文件名
// [in] className -- 类名,包含命名空间
// [in] netFrameVersion -- NetFrame版本号
// 返回: 返回值int表示结果,-1,表示运行方法失败
// 编写: 张伟强,20170725
// ---------------------------------------------------------------
cgCLRAccess::cgCLRAccess(CString fileName,CString className,CString netFrameVersion)
{
m_szFileName=fileName;
m_szClassName=className;
m_szNetFrameVersion=netFrameVersion;
m_pClrHost =NULL;
//注意只能调用一次,第一个需要传递c#dll的.net framework版本号,缺省空为2.0
HRESULT hr = CorBindToRuntimeEx(m_szNetFrameVersion,
NULL,0,
CLSID_CLRRuntimeHost,
IID_ICLRRuntimeHost,
(PVOID*)&m_pClrHost);


if(hr != S_OK||hr != S_FAILED)
{
m_pClrHost = NULL;
return;
}
if(m_pClrHost)
{
hr=m_pClrHost->Start();
}
}
cgCLRAccess::~cgCLRAccess()
{
if(m_pClrHost != NULL)--只能加载一次
{
m_pClrHost->Stop();
m_pClrHost->Release();
}
}
// ---------------------------------------------------------------
// 名称: RunMethod
// 功能: 运行方法
// 变量: [in] szMethodName -- 方法名称
// [in] szParamString -- 方法参数
// 返回: 返回值int表示结果,-1,表示运行方法失败
// 编写: 张伟强,20170725
// ---------------------------------------------------------------
int cgCLRAccess::RunMethod(CString szMethodName,CString szParamString)
{
DWORD retVal=0;
//将dll加载到默认应用程序域中,并调用其中的方法
HRESULT hr = m_pClrHost->ExecuteInDefaultAppDomain(m_szFileName,m_szClassName,szMethodName,
szParamString,&retVal);
//后面增加错误处理
if(hr!=S_OK)
{
retVal = -1;
}
return retVal;
}

   3.c++调用的代码如下:
CString szParam=_T("test");
// 需要注意,这个类只能定义一次。_T("v4.0.30319")为c#依赖的.NetFrame版本号,如果传递错误,则会导致后面运行ExecuteInDefaultAppDomain出错,错误代码-2146234341或者FFFFFFFF8013101B。CLRLib.dll 为dll库的文件名,需要时要带路径
cgCLRAccess clrAccess(_T("CLRLib.dll"),_T("CLRLib.cgCLRLibAccessAdapter"),_T("v4.0.30319"));
int nRet =clrAccess.RunMethod(_T("IsTest"),szParam);

   按照以上操作,就完成了整个过程。以上,是我的学习过程遇到的问题和解决办法,记录下来防止自己忘记,同时也与大家分享,免走弯路。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shagu/article/details/76222637

智能推荐

蓝桥杯之单片机设计与开发(22)——常用程序封装_单片机程序封装_小默haa的博客-程序员秘密

目录0、初始化外设1、数码管2、独立按键3、矩阵键盘4、定时器初始化5、iic和E2PROM6、AD采集电压7、DS18B208、DS13029、超声波2019年3月5日更新更改了独立按键的驱动程序 更改了DS18B20的初始化程序可以设置DS18B20精度 更改了DS1302的初始化程序,每次上电都重新设置时间 更改DS18B20的驱动程序,...

QEMU文档之NVME模拟_qemu nvme_linux解码者的博客-程序员秘密

QEMU通过"nvme","nvme-ns"和"nvme-subsys"设备提供NVME模拟。1 增加NVME设备1.1 控制器模拟QEMU模拟的NVME控制器为NVME spec V1.4。所有强制特性有如下异常和限制:(1)当设备上电时SMART/Health log page上的数据被重置;(2)中断合并不支持且默认是禁用的;在QEMU PCI总线上添加一个NVME控制器最简单的方法为增加如下参数:-drive file=n...

网络安全之认识日志采集分析审计系统_xiejava1018的博客-程序员秘密

日志对于大家来说非常熟悉,机房中的各种系统、防火墙、交换机、路由器等等,都在不断地产生日志。无数实践告诉我们,健全的日志记录和分析系统是系统正常运营与优化以及安全事故响应的基础。我们一起来认识日志采集分析审计系统。

POJ3279_圣帝天龙的博客-程序员秘密

黑白翻转的问题,值得借鉴的是:1.使用左移+按位与运算的方法保留二进制相应位置的数字2.memcpy函数的使用,用于数组的复制3.使用0x3f3f3f3f表示无穷大 #include&amp;lt;iostream&amp;gt;#include&amp;lt;cstring&amp;gt;#include&amp;lt;string&amp;gt;//数组复制函数using namespace std;int map...

Vue使用日记(24):vue-router详解(5)——嵌套路由_jimson_zhu的博客-程序员秘密

嵌套路由嵌套路由是一个很常见的功能,比如在home页面中,我们希望通过/home/news和/home/message访问一些内容,一个路径映射一个组件,访问这两个路径也会分别渲染两个组件。也就是在大页面home下面嵌套/home/news和/home/message这两个路由,组件切换是在home这个大页面进行。实现步骤演示:1、首先定义两个子组件,用于进行嵌套:2、然后...

随便推点

QQ添加好友时的验证码识别问题_weixin_33806509的博客-程序员秘密

QQ添加好友时的验证码识别问题 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiMultimedia/html/delphi_20061102022023183.htmlQQ添加好友时的验证码识别问题     开发语言   delphi   给个思路???     谁有代码,贴个上来,不胜感激怎么就没人理我呀,UP...

mysqldump: Got error: 1044: Access denied for user 'root'@'%' to database_"mysqldump: got error: 1044: \"access denied for u_一点寒芒先至的博客-程序员秘密

错误情景】:导出远程数据库时报以下错误。【错误信息】:mysqldump: Got error: 1044: Access denied for user 'root'@'%' to database 'hhh' when using LOCK TABLES【报错原因】:mysqldump 命令执行时,需要四种权限,分别是:select,show view,trigger,lock ...

从”零“开始_zhjx922的博客-程序员秘密

从”零“开始?为什么这么说呢?四年前,在高中时代打了个酱油就毕业了,该学的一点都没学,天天看着小说,睡着觉就过去了。差点都没有上了大学,能进了一所大专,我得感谢上苍~如今,毕业一年了,一直和PHP打着交道,虽然中间也”偷偷“学过其它语言,java,c++,python,我不是神童,所以我又打了一次酱油。。。每一次都让自己觉得干这个,干那个,可都是不了了之,但是慢慢的我也发现了好

SSL证书转换:cer转jks,pfx转jks_lgq2016的博客-程序员秘密

进入jdk相应的目录使用keytool工具:cd C:\Program Files\Java\jdk1.8.0_101\binpfx转换为jks命令:keytool -importkeystore -srckeystore "D:\aaa\test\client.pfx" -srcstoretype pkcs12 -destkeystore "D:\aaa\test\clientjks" -deststoretype JKScer转jks命令:keytool -import -alias m

使用scp复制传输windows文件到linux_pjqdyd的博客-程序员秘密

(scp基于ssh登录,所以如果没有安装ssh无法进行文件拷贝)检查linux是否安装ssh服:ssh localhost提示’‘ssh: connect to host localhost port 22: Connection refused’’如上所示则说明还没有安装ssh或ssh服务未启动.2.安装sudo apt-get install openssh-server (使用...

【计算机视觉】SuperResolution_路途…的博客-程序员秘密

Tian Y, Zhang Y, Fu Y, et al. Tdan: Temporally-deformable alignment network for video super-resolution[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020: 3360-3369.Paper: Tdan Tdan: Temporally-deformable alig.

推荐文章

热门文章

相关标签