簡體   English   中英

如何使用C ++代碼中的C#dll中定義的類

[英]How to use a class defined in c# dll from c++ code

我有一個用c#編寫的dll,我在我的c ++代碼(正是MFC)中使用了這個dll。 我可以使用具有返回值int,字符串的dll函數。但是我需要使用具有返回值c#類的函數! 我不知道MFC用於將函數的返回值放入c# dll中的哪種數據類型。 c#返回值對象在MFC轉換為_variant_t 請幫我。 感謝您閱讀我的問題

C#代碼(抽象)

[Guid(" - - - - ")]
public interface ITestClass
{
     object Func();
}

[Guid(" - - - - ")]
public class TestClass : ITestClass
{
   public object Func()
   {
       Project1.Class1 data = dataList[0];
       return data ;
   }
}

MFC代碼(抽象)

ITestClass *ptc = NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_TestClass, NULL, CLSCTX_INPROC_SERVER, IID_ITestClass, reinterpret_cast<void**>(&ptc));

int sum = ptc->Sum(5, 30); // It is perfect

data = ptc->Func(); // I don't know what data type is

您將必須具有在C ++中定義的相同類。 這有點難,可能有故障。 因此,我將嘗試使用CLI。

或者有一種更簡單的方法。 不要那樣做:)很好,請使用舊的良好機制,例如:

int objectHandle = ptc->CreateObject();
int data = ptc->GetSomeIntData(objectHandle);
ptc->DoSomeOperation(objectHandle);
ptc->ReleaseObject(objectHandle);

這個想法是您在C ++方面沒有一個類。 該對象在C#端創建,並具有其唯一的對象句柄(可以是哈希碼)。 您在CreateObject中返回此句柄,並在C#端可以將對象存儲在字典中:

Dictionary<int, MyClass>

然后在C ++方面,您可以使用objectHandle調用函數。

完成相同結果的方法要簡單得多。

但是,如果您真的想使用此類,則可以嘗試以下操作:-確保C#庫與com兼容(注冊COM互操作選項)-編譯C#庫之后,應該有一個tlb文件。 用c ++導入:

#import "path\to\lib.tlb"

接下來,您可以像這樣使用它:

CoInitialize(NULL);
ClassNamespace::ITestClassPtr myClass(__uuidof(ClassNamespace::TestClass));
myClass->Func();
CoUninitialize();

您還可以在C ++類中包裝所有這些功能。 這當然會增加工作量,並使您必須保留兩個相似的代碼(真實類和包裝類)。 但是使用起來可能更友好。

如果要返回其他類,則必須以類似的方式進行。 創建com接口,在c ++中使用它,然后在c#中返回它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM