正如標題所暗示的,我很難從C++調用C#代碼。一點上下文:在C#中有一個API調用(在C++版本的API中不存在),我需要將它集成到一個更大的C++項目中。在C++(COM)中使用C#代碼Dll導入不能正常工作
我一直在閱讀this SO post,並且用COM方法取得了最大進展。
我的C#的DLL編譯*。所產生的DLL和TLB文件複製到相應的C++項目目錄後,我打開管理員CMD在同一個C++項目目錄提示符,然後運行:
regasm MyFirstDll.dll /codebase /tlb
(*我編譯它作爲一個類庫,大會名稱: MyFirstDll,默認命名空間:MyMethods,程序集信息... - >使彙編Com-Visible被選中,Build-> Register for COM interop也被選中。)
使用對象瀏覽器,我能夠看到類我定義了一個具有適當的參數和簽名的方法。 Screenshot of it showing up in Object Browser
我遇到的問題是方法調用(而不是類)。即使該方法在對象瀏覽器中可見,但在我的代碼中,它不會被識別爲對象的方法。
類 「ATL :: _ NoAddRefReleaseOnCComPtr」 沒有成員 「添加」
這裏是我的代碼:
MyFirstDll C#項目:
using System;
using System.Runtime.InteropServices;
//
namespace MyMethods
{
// Interface declaration.
[Guid("8a0f4457-b08f-4124-bc49-18fe11cb108e")]
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface Easy_Math
{
[DispId(1)]
long Add(long i, long j);
};
}
namespace MyMethods
{
[Guid("0cb5e240-0df8-4a13-87dc-50823a395ec1")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MyMethods.AddClass")]
public class AddClass: Easy_Math
{
public AddClass() { }
[ComVisible(true)]
public long Add(long i, long j)
{
return (i + j);
}
}
}
NateMath.h:
#include <atlcomcli.h>
#import "MyFirstDll.tlb"
class NateMath
{
public:
NateMath(void);
~NateMath(void);
long Add(long a, long b);
private:
CComPtr<MyFirstDll::AddClass> adder;
};
NateMath.cpp:
#include "stdafx.h"
#include <atlcomcli.h>
#import "MyFirstDll.tlb"
#include "NateMath.h"
NateMath::NateMath(void)
{
CoInitialize(NULL);
adder.CoCreateInstance(__uuidof(MyFirstDll::AddClass));
}
NateMath::~NateMath(void)
{
CoUninitialize();
}
long NateMath::Add(long a, long b) {
return adder->Add(a,b);
}
問題是在「返回加法器 - >添加(a,b)」(NateMath.cpp)添加(a,b)顯示紅色與類「ATL :: _否AddRefReleaseOnCComPtr」沒有成員「添加」
嘗試使用'CComPtr'而不是'CComPtr '。 –
@HansPassant這很好知道!不幸的是,在更新C#AddClass將代碼添加到int Add(int i,int j)中,仍然出現同樣的錯誤。:( –
@MichaelGunter如果我使用CComPtr而不是類,它將如何知道調用我的類的實現方法? –