[英]Implement a C# DLL COM File In Unmanaged C++ Program
這是我引起這個問題的另一個問題,也作為參考: 如何從非托管C ++調用托管C ++方法
我已經成功創建了一個C#COM文件。 現在,我需要簡單說明如何在非托管C ++中實現它。
我正在關注此示例,但是c ++部分比較薄弱。 http://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C
這是我的COM文件
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace cSharpRiJHarn
{
[Guid("ED1483A3-000A-41f5-B1BC-5235F5897872")]
public interface DBCOM_Interface
{
[DispId(1)]
String encrypt(string s);
[DispId(2)]
String decrpyt(string s);
}
[Guid("A6BCEC1D-B60C-4c97-B9AD-1FE72642A9F8"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
{
}
[Guid("7C13A8C6-4230-445f-8C77-0CA5EDECDCB5"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class RijndaelLink : DBCOM_Interface
{
public String encrypt(String s)
{
return Rijndael.EncryptString(s);
}
public String decrpyt(String s)
{
return Rijndael.DecryptString(s);
}
}
}
我只是想要一個非常基本的示例,將其與非托管代碼一起使用。 請在您的答案中包括:
謝謝你的幫助!
您需要做的第一件事是在.NET中正確定義COM對象,以供非托管環境(C ++或其他)使用。 這是一個不錯的定義:
namespace cSharpRiJHarn
{
[Guid("ED1483A3-000A-41f5-B1BC-5235F5897872")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
public interface IRijndaelLink
{
string encrypt(string s);
string decrypt(string s);
}
[Guid("7C13A8C6-4230-445f-8C77-0CA5EDECDCB5")]
[ComVisible(true)]
public class RijndaelLink : IRijndaelLink
{
public string encrypt(string s)
{
return Rijndael.EncryptString(s);
}
public string decrypt(string s)
{
return Rijndael.DecryptString(s);
}
}
}
接下來,您需要使用RegAsm工具為COM注冊此.NET程序集。 我建議您還使用它構建類型庫(.TLB) ,如下所示(我想您是為X86而不是X64構建整個庫):
c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe YourAssembly.dll /tlb:YourAssembly.tlb /codebase
請適應您的實際路徑。 還要檢查代碼庫arg,因為在生產中可能不需要它。
這將建立一個同時包含接口和類的.TLB文件。 之所以有效,是因為我們添加了ComVisible屬性。 您還將注意到,我沒有定義Dispatch或Dual接口,因為在此示例中,我不需要COM Automation (VB,VBA)或任何腳本語言(VBScript,JScript)支持,僅需要IUnknown接口,這些接口更易於使用在普通C / C ++中,而不是IDispatch接口。
現在,有一種簡單的方法可以使用Microsoft特定的C ++擴展名將其導入不受管理的c ++世界: #import Directive ,類似於.NET中的“添加引用”。 這是使用COM對象的示例控制台應用程序:
#include "stdafx.h"
#import "c:\MyPathToTheTlb\YourAssembly.tlb" // import the COM TLB
using namespace YourAssembly;
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); // needed to enter COM space
IRijndaelLinkPtr ptr(__uuidof(RijndaelLink)); // create the COM Object with the desired interface
_bstr_t s = ptr->encrypt("hello"); // call the function
printf("%S", (LPWSTR)s); // for example
CoUninitialize();
return 0;
}
您會注意到#import指令還創建了很酷的包裝器(_bstr_t,因為.NET字符串將在此處導出為Automation BSTR,甚至對於IUnknown接口也是如此)以進行字符串處理,所以這沒什么大不了的。
這不是所有這些都能起作用的唯一方法,但是恕我直言,恕我直言,這是最簡單的方法之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.