用C++调用C#生成的dll(动态链接库文件)


问题来源

问题怎么来的呢。在工作过程中,需要用Teigha将CAD的一些基本操作嵌入到一个程序中,但是我们只有C#的TD_Mgd_3.03_9.dll,而之前的工程是用C++做的,所以涉及到怎么用C++语言调用C#生成的dll。

先讲一讲AutoCAD二次开发,挺好玩的。
AutoCAD是一个工程类的绘图软件,其环境下的文件格式是DWG,为了垄断市场,DWG文件格式是保密的,如果要解析,必须在AutoCAD上操作。但是市场上有很多只需要读写的需求,但是又不想要用AutoCAD这个庞大复杂的软件,于是Open Design Alliance组织应运而生了,这个组织有一家公司OpenDWG公司,该组织逆向了DWG文件,其官网上有这么一句话Our most basic statement of philosophy is this : It is users who own their design data ,and it is users who should control that data.(我们的基本观点是,用户拥有他们设计的数据,所以也应该由用户控制这些数据),当然还有其他公司,基本都是ODA成员。当然AutoCAD也在做一些扩充开发工具,比如ObjectArx但是这只是功能的扩充,不能脱离AutoCAD环境。
那么如果我们有接口是不是就可以嵌入我们的程序中呢,然后对他进行读取。答案是可以的,但是需要花钱买。但是我们公司买的是C#版本的,没有C++版本的,但是业主又要C++开发,所以,我们就只能包装一下生成DLL,然后用C++调用。

这里就不讲CAD的二次开发是个什么东西,也不讲Teigha是个什么东西,这些在另外的文章写,这里我只给你一个C#生产的dll.现在来讲这个dll.


  • TD_Mgd_3.03_9.dll

TD_Mgd_3.03_9.dll里面有6个命名空间分别是

  • Teigha.Colors — 对应于OdCm的非托管类,包含了处理颜色的类。
  • Teigha.DatabaseServices —对应于OdDb的非托管类,包含了数据库类。
  • Teigha.Geometry — 对应于 OdGe 的非托管类. 用于执行一般的二维和三维几何操作。
  • Teigha.GraphicsInterface — 对应于OdGi 的非托管类. 包含实体向量化的类。
  • Teigha.GraphicsSystem — 对应于OdGs 的非托管类 ,包含图形系统类
  • Teigha.Runtime — 包含系统级别的函数类, 例如运行时注册和识别的类。

其中database的结构:(转自网上)
用C++调用C#生成的dll(动态链接库文件)_第1张图片


1.clr的方法调用##

如果用C#语言,按常规写就好了,或者如果有C++版的Teigha动态链接库,用C++写就好了,但是现在的问题是需要用C++调用C#生成的dll.平常用的多的是用C#调用C++生成的dll.反过来要复杂一些。C#编译的dll需要用CLS(公共语言定义,另外一篇文章解释)进行解释,但是C++项目默认配置没有公共语言运行支持的,所以需要更改配置。

在实验的时候,可以自己创建一个C# 的dll(至于怎么建,见基础篇),写一个函数就行了,也可以直接用Teigha的dll.
创建一个C++的项目,MFC也好,Win32控制台应用程序也好,记得将C# 的dll放置在C++的可执行程序目录下面。
小例子,引用的时候:

//C#创建的DLL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 命名空间
{
	public class 测试类
	{
		public int 测试函数(int x,int y)
		{
			return x + y;
		}
	}
}

//然后创建C++项目
#include "stdafx.h"//项目自带
#using "../debug/你dll的名称.dll" //注意不要用#include 
using namespace 命名空间
int _tmain(int argc ,_TCHAR* argv[])
{
	int x,y,testResults;
	x = 10;
	y = 20;
	测试类 ^a = gcnew 测试类(); //创建了一个托管对象,放在gc堆里用^不用*是因为C++/clr语法的原因
	testResults=a->测试函数(x,y);
	printf("计算结果为:%d",testResults);
	return 0;
}

然后找到项目的属性配置,将常规的公共语言运行时支持改成:公共语言运行时支持/clr。

需要补充的是C#dll是委托代码,而C++的是非委托的。所以不能直接引用。

2.借COM组件来调用

当时做的时候觉得直接调用应该很麻烦,所以就想着用COM组件来周转一下,

3.利用API

在本博主的“C#和C++ 有关DLL的”也有讲。

你可能感兴趣的:(基础)