1. 程式人生 > >利用c#實現dll動態庫,並在c++中呼叫的方法

利用c#實現dll動態庫,並在c++中呼叫的方法

           近期,在進行一個大專案開發。其中涉及多語言協同開發。主要是c#dll和c++dll的開發和應用,其中,需要在c++中呼叫c#dll的內容。現在把開發中的經驗、教訓和注意事項總結整理如下,希望對其他人能有所幫助。

          1.建立c#dll,選擇屬性“生成”,勾選上”輸出"的"為com的互操作註冊"。這樣生成dll的時候,自動生成了相應的tlb檔案供c++dll庫使用。

          2.建立介面宣告類,並且在其中定義介面方法,注意需要的[DispId(1)]中序號的遞增。

    //介面宣告     
    [Guid("50002E5B-1466-42EA-BD84-CC354C6FE141")]
    public interface ComInteropInterface
    {
        /// <summary>
        ///測試
        /// </summary>
        /// <param name="szTipInfo">提示資訊</param>
        /// <returns>1表示測試成功,-1表示一種情況失敗,-2表示....</returns>
        [DispId(1)]
        int Test(int nFlag);

     }

     3.建立介面實現類

 [Guid("21434AD8-0F73-4950-8A97-521209D6D011")]
 [ClassInterface(ClassInterfaceType.None)]
 public class jgTestComInterop : ServicedComponent, ComInteropInterface

 {

        /// <summary>
        ///測試
        /// </summary>
        /// <param name="szTipInfo">提示資訊</param>
        /// <returns>1表示測試成功,-1表示一種情況失敗,-2表示....</returns>
       public  int Test(int nFlag)

{

int nRet = 1;

               ....

               return nRet;

 }

}

4.編譯生成對應的dll和tlb檔案。

5.建立一個c++dll,選擇“屬性”,將"配置屬性"中的"c/c++"的“多處理器編譯”設定為false。

6.在c++的實現中,匯入對應的tlb檔案。如下

#import "Debug//Test.tlb"  

呼叫實現程式碼如下:

Test::ComInteropInterfacePtr   ptrTest;  

HRESULT hr;
hr = ptrTest.CreateInstance(__uuidof (Test::jgTestComInterop ));     
if(hr == S_OK)     
{     
lRet = ptrTest->Test(1);

       
...

總結整理自己的經驗和教訓,可以讓自己提高,避免下次犯同樣的錯誤,調理更清楚,另外,也可以給初學者提供一個學習和使用的幫助。拋磚引玉,希望得到大家的指點和交流。

相關推薦

利用c#實現dll動態c++呼叫方法

           近期,在進行一個大專案開發。其中涉及多語言協同開發。主要是c#dll和c++dll的開發和應用,其中,需要在c++中呼叫c#dll的內容。現在把開發中的經驗、教訓和注意事項總結整理如下,希望對其他人能有所幫助。           1.建立c#dll,

利用Python實現讀取Nginx日誌將需要信息寫入到數據

creat rip ger form use nginx日誌 zabbix 創建 auth #!/usr/bin/env python # coding: utf-8 # Auther:liangkai # Date:2018/6/26 11:26 # License: (

Android TV利用viewPager實現輪播圖通過handler進行邏輯控制

    公司要求實現一個輪播圖,滾動圖片及其對應文字。共有五張圖,包含小圓點。     最初的實現是參考了https://blog.csdn.net/zhaoxiaojian1213/article/details/78280132,使用ViewPager實現,新開一個執行

VS如何將核心函式封裝成dll、lib供給第三方呼叫

本文首發於微信公眾號【視覺IMAX】,作者原創。 文章目錄 前言 一 先封裝核心函式,實現功能 二 將核心函式生成dll、lib(此處以debug模式下為例,release模式下相類似) 三 呼叫dll、lib檔案 四

DLL動態巢狀跨級呼叫問題

在應用過程中,動態庫呼叫動態庫是常見操作。其在理論上可行,實施也相對簡單,呼叫層次關係如下: App主程式---(同目錄)--->DLL_A------(同目錄)----->DLL_B&DLL_C 圖1 呼叫層次關係 針對圖1所示的應用,應對的方法如

實現select動態新增option選中的多種方法

 select動態新增option並選中,然後立刻把新增的option設為選中狀態 普通的javascript實現方法一: var opt = document.createElement("OPTION"); opt.value = 6; opt.text  = "分類名

php實現c#一致的DES加密解密 (php呼叫方法

php實現和c#一致的DES加密解密,可以從網上搜到一大堆,但是測試後發現都沒法用。以下正確程式碼是我經過苦苦才找到的。希望大家在系統整合時能用的上。<p>注意:key的長度為8位以內。</p> //C# 版DES 加解密演算法 using Syst

在VS2013下編譯json-c簡單生成json格式數據

ray string 數組 ring std bject sub obj ++ #include "stdafx.h"#include "json-c/json.h" int _tmain(int argc, _TCHAR* argv[]){ // 正常的json格式 js

c++用priority_queue實現最小堆求解最大的n個數

輸出 return bool rand cto and gre main 最小堆 1 //c++用priority_queue實現最小堆,並求解很多數中的最大的n個數 2 #include <iostream> 3 #include <queue&

GO語言生成C動態再被連結成新動態

目錄 目標 測試程式碼 編譯步驟 GO ----> 動態庫 再封裝成新動態庫 編譯生成可執行檔案 嘗試GO---->C靜態庫---->C動態庫。 目標 如果想把GO語言實現的功能整合到C固定介面上,中間需要多加一次封裝。 因為很難用GO直

Java實現MD5演算法過程利用自帶MD5函式進行對比校驗

文章目錄 一、環境說明 二、演算法原理概述 三、程式設計 資料結構 重要模組步驟 四、執行結果 一、環境說明 作業系統:window10 程式語言:Java (J

PB呼叫.NET/C#開發的動態DLL的問題

之前用C#做了一個Dll提供給第三方呼叫(主要為PB使用者)。 pb一直無法呼叫我寫的dll,導致問題排查了3天。 最後找出原因是因為,對方環境沒有安裝.net framework。沒有將dll註冊導致的。

openlayers 利用draw互動元件實現框選功能顯示框選經緯度

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="..

資料結構 一元稀疏多項式 利用鏈式儲存實現儲存一元多項式計算兩個一元多項式之和

一、實驗原理 利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和。一元多項式由係數和指數構成。 1、create()儲存係數指數:首先建立一個頭結點headLnode,從headLnode->next開始存入係數和指數,只有係數是0時,才表示這個多項式的結束,否

php利用phpqrcode生成二維碼將二維碼蓋在一張圖上實現美化

       這兩天在開發一個支付寶授權功能,因為要用到二維碼分享掃描功能,每條記錄都有專屬的二維碼,所以需要生成專屬二維碼並且這個二維碼還得有些引導功能,所以需要將生成的二維碼放在實現準備好的圖片上面。       &nbs

C#呼叫C/C++動態封裝各種複雜結構體。

    現在公司要做一個使用C#程式呼叫C++的一個DLL庫,解析檔案的功能。所以在網上找了一些資料。     一、結構體傳遞 #define JNAAPI extern "C" __declspec(dllexport) // C方式匯出函式 typedef str

Android GridView之新增分隔線動態設定高度實現高度自適應解決第一個item不顯示的問題

最近做一個專案時遇到一點問題,在這裡分享一下解決思路。 首先看效果圖: 這裡的需求是實現介面中的六個圖示,博主後來和同事討論過這個問題,用 GridView 實現費時費力好嘛,同事認為做6個 Button 就 好了,可能博主就愛鑽牛角尖吧,一開始認為怎麼辦只要還有辦法那就

靜態動態dll檔案、lib檔案隱式連結、顯式連結淺見

靜態連結、動態連結 靜態庫和動態庫分別應用在靜態連結方式和動態連結方式中,所謂靜態連結方式是指在程式執行之前完成所有的連結工作,把靜態庫一起打包合入,生成一個可執行的目標檔案(EXE檔案)。所謂

關於QT動態利用動態匯入介面(例項)

    最近需要搞懂一個事情,就是QT如何用使用動態庫。我們需要解決以下幾個問題: 1.有時候我們不希望在當前工程下設計介面,而是希望把介面做成一個動態連結庫,然後主程式呼叫這個動態連結庫,然後主程式把這個動態庫中包含的介面show出來。 2.我們希望進行外掛式開發,也就

C++對dll連結的顯示(動態呼叫和隱式(靜態)呼叫

C++呼叫dll連結庫的方式有兩種:動態呼叫(又叫顯示呼叫)、靜態呼叫(又叫隱式呼叫)。 一、靜態呼叫dll     靜態呼叫,又稱隱式呼叫。由編譯系統完成對DLL的載入和應用程式結束時DLL解除安