タイトルが示すように、C++からC#コードを呼び出す際に問題があります。コンテキストのビット:C#にAPI呼び出し(APIのC++バージョンには存在しません)があり、これをはるかに大きなC++プロジェクトに統合する必要があります。C++(COM)でのC#コードの使用Dllのインポートが正常に機能しない
私はthis SO post以上を読んでおり、COMメソッドで最も進展しました。
私のC#dllは*をコンパイルします。適切なC++プロジェクトディレクトリに結果のDLLとTLBファイルをコピーした後、私は管理者が同じC++プロジェクトディレクトリに促して実行CMD開く:
regasm MyFirstDll.dll /codebase /tlb
(*私はクラスライブラリ、アセンブリ名としてそれをコンパイルします。 MyFirstDll、Default namespace:MyMethods、Assembly Information ... - >アセンブリのCom-Visibleをチェックし、COM- interopのためのBuild-> Registerもチェックされています)。
オブジェクトブラウザを使用して、私は、適切なargsと署名を持つメソッドと同様に定義しました。 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);
}
"add adder-> Add(a、b)"(NateMath.cpp)のAdd(a、b)が "ATL :: _ NoAddRefReleaseOnCComPtr"クラスで赤色で表示される問題は、 "Add"というメンバがありません
'CComPtr'の代わりに 'CComPtr 'を使ってみてください。 –
@HansPassantそれは知っておきたいことです!残念なことにC#AddClass (int i、int j)のコードを追加すると、同じエラーが表示されます:( –
@MichaelGunterクラスの代わりにCComPtrをインターフェイスに使用すると、クラスの実装を呼び出す方法をどのように知ることができますか?方法? –