用C++調用C#生成的dll(動態鏈接庫文件)

在工作過程中,需要用Teigha將CAD的一些基本操作嵌入到一個程序中,但是我們只有C#的TD_Mgd_3.03_9.dll,而之前的工程是用C++做的,所以涉及到怎麼用C++語言調用C#生成的dll。這裏就不講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的結構:(轉自網上)
官網上應該有


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章