上篇文章提到,目前项目想做到核心部分代码不被反编译,而考虑到团队成员都是比较熟悉C#,因此核心算法部分采用C++,而其他地方则采用C#(例如数据访问层,界面层都使用C#语言)。在上一篇文章中完成了C#托管代码调用C++非托管代码,现在接着完成第二部分,即C++非托管代码调用C#托管代码(源代码下载),分为两部分,首先C#建立COM+组件,其次是C++调用COM+组件。

 C#建立COM+组件

1. 在VS中,新建类库ComInterop

2.  在类库新增接口:ComInteropInterface, 及相应的实现ComInterop, ComInterop同时必须继承自ServicedComponent。ComInteropInterface中有两个简单接口:

int Add(int a, int b);

int Minus(int a, int b);

具体代码如下:

Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;
using System.EnterpriseServices;

namespace ComInteropDemo
{
    //接口声明
    [Guid("7103C10A-2072-49fc-AD61-475BEE1C5FBB")]   
    public interface ComInteropInterface
    {
        [DispId(1)]
        int Add(int a, int b);

[DispId(2)]
        int Minus(int a, int b);
    }

//对于实现类的声明
    [Guid("87796E96-EC28-4570-90C3-A395F4F4A7D6")]
    [ClassInterface(ClassInterfaceType.None)]
    public class ComInterop : ServicedComponent, ComInteropInterface
    {
        public ComInterop() { }

public int Add(int a, int b)
        {
            return a + b;
        }

public int Minus(int a, int b)
        {
            return a - b;
        }
    }
}

3 . 使用REGASM命令导出虚拟表,当重新编译生产Dll时需要使用REGASM  /u命令将前一次Dll注销

REGASM  ComInteropDemo.dll /tlb ComInteropDemo.tlb

REGASM  /u ComInteropDemo.dll

首先对COM+组件的写法需要注意以下几点:

1. 接口,事件,方法,属性必须是public

2.  方法和属性必须在接口中声明,事件也必须在事件接口中声明.

否则将在VC中无法调用,在接口中声明主要是为了在COM 中的vtab中.

3.  必须对接口中的方法,属性,事件前声明[DispId(1)]

4. 每个接口都必须有一个GUID

5.  而且项目一定需要是COM Interop,并且具有强命名

6.  组件ComVisible属性必须为true,这里强调的原因是VS中默认值为false

C++调用C# COM+组件

步骤:

1. 建立C++ 项目CppLoader,项目类型选择Win32,控制台应用程序

2.  在头文件中导入类型库tlb

#import "..\\Debug\\ComInteropDemo.tlb"

3. 初始化COM以及产生智能指针(一般是在需要调用COM组件中提供的方法时就需要产生指向该接口的智能指针)

4. 调用COM中的方法Add

5. 释放环境 ,具体代码如下

Code
#include "stdafx.h"
#include <iostream>
using namespace std;

#import "..\\Debug\\ComInteropDemo.tlb"
//路径一定要正确

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;

//ComInteropDemo::ComInterop *p;

//初始化COM
    CoInitialize ( NULL );

//创建智能指针ComInteropDemo::ComInteropInterface
    ComInteropDemo::ComInteropInterfacePtr ptr;

//创建实例
    hr = ptr.CreateInstance(__uuidof (ComInteropDemo::ComInterop));

if(hr == S_OK)
    {
        cout << ptr->Add (1.0, 2.0);
    }

CoUninitialize (); 
    return 0;
}

附件: 源代码下载, 上一篇文章C#托管代码调用C++非托管代码

转载于:https://www.cnblogs.com/Jianchidaodi/archive/2009/03/11/1408661.html

C#托管代码与C++非托管代码互相调用二(C++调用C#代码)相关推荐

  1. C#托管代码与C++非托管代码互相调用一(C#调用C++代码.net 代码安全)

    在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能 ...

  2. Android WebView 和 javaScript的互相调用(二)

    原文出处:http://blog.csdn.net/wangtingshuai/article/details/8635787 WebView相关阅读 Android WebView 和 javaSc ...

  3. 【OS学习笔记】二十四 保护模式七:调用门与依从的代码段----特权级保护

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章学习了保护模式下的任务与任务隔离,以及简单介绍了保护模式下 ...

  4. 拒绝捞回中的效果评估与策略二次调用

    在精细化管理的当下,拒绝捞回经常作为重要的辅助工具帮我们来从拒绝客户中寻找偏好的客户进行授信. 常规的捞回方法,会对命中某些策略的客群进行调整,这里面我们会应用模型分和策略调优等手段进行相关的捞回操作 ...

  5. Android 面部识别之二(调用开源面部识别算法seetaface检测)

    Android 面部识别之二(调用开源面部识别算法seetaface检测) https://github.com/seetaface/SeetaFaceEngine(Seetaface官方地址) 如果 ...

  6. Java - 关于HashMap通过keySet遍历kv的二次调用问题

    Java - 关于HashMap通过keySet遍历kv的二次调用问题 一. HashMap的常规遍历 二. keySet的二次遍历问题 2.1 foreach和迭代器 2.2 问题分析 2.3 总结 ...

  7. java生成二维码 并调用二维码打印机

    自己折腾了好久,百度.google了半天,发现java生成二维码的文章倒是很多,但是调用二维码打印的就很少了,好多打印出来要么是二维码占用好几张纸,要么就是多出4.5张白纸,浪费了我不少的条码纸,最终 ...

  8. ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析

    目录 1. 课堂内容 1. 获取Modis Swath数据(这里只获取Lat.Lon.Aod(气溶胶厚度)三个数据集以及aod数据集的两个属性),并对aod数据进行简单的处理 2. 调用二次开发接口以 ...

  9. 直观讲解一下 RPC 调用和 HTTP 调用的区别!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:浮生忆梦 blog.csdn.net/m0_3811 ...

  10. 直观讲解一下RPC调用和HTTP调用的区别

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浮生忆梦 blog.csdn.net/m0_38110132 ...

最新文章

  1. 消息称苹果正在组建新智能家居团队
  2. bzoj3410[Usaco2009 Dec]Selfish Grazing 自私的食草者*
  3. 总有人愿意为了你多做一些
  4. 前端教程丨手把手教你用 Next.js 搭建个人博客,从入门到吃鸡
  5. 官宣,11月8号,.NET6+64位VS璀璨面世!
  6. spark学习-65-源代码:schedulerBackend和taskScheduler的创建(3)-local-cluster
  7. Eclipse+Tomcat+MAVEN+SVN项目完整环境搭建
  8. SqlServer驱动包不同,取出数据的编码居然不同
  9. 超详细的Java面试题总结(三)之Java集合篇常见问题
  10. 数据库与表的操作之编辑表结构(ALTER TABLE)
  11. codeforces 584E Anton and Ira [想法题]
  12. AWS DeepRacer ROS 架构 模拟环境和真实赛道的区别
  13. 我是如何黑掉惠普打印机的
  14. pb调用C++dll问题
  15. source-map
  16. 【InSAR 笔记2】哨兵一号精轨数据批量下载【修改0704】
  17. android系统与苹果手机号码,苹果手机号码怎么导入到手机 苹果手机号码导入到手机的方法步骤【图文教程】...
  18. 原型制作与图解——墨刀工具
  19. TCP/IP模型背后的内涵(一)
  20. 点击按钮获取listview网上数据

热门文章

  1. 概率编程库Pymc3案例之线性回归
  2. 如何新增或修改ns2的核心模組--queue management
  3. Ribbon 负载均衡调用01——概述
  4. 分支结构||分支循环结构||使用原生js遍历对象
  5. 电磁场与电磁波第二章 电磁场的基本规律
  6. flipdim--按指定维数翻转矩阵
  7. 图像添加Beta分布噪声
  8. c++中的list用法
  9. 第六篇T语言实例开发,多点找色应用
  10. ACM_变形课(并查集)