私たちはクライアントのexeをC#で作成しています.COM dllと1つのネイティブC++静的ライブラリで書かれたレガシーコードがあります。 C#クライアントの機能を完成させるためには、両方を使用する必要がありました.C#コード内でCOMクラスのインスタンスを作成できるように、interopを使用してCOM dllへの参照を追加しました。今このCOMクラスメソッドは、nactive C++のオブジェクトである引数をとります。COM クラスのメソッドの中には、C++静的ライブラリで宣言されたクラスのオブジェクトである引数を必要とするものがあります。 C#でC++ネイティブクラスのインスタンスを作成できないため、ネイティブクラスにC++/CLIラッパーを作成し、C#コードでワーカーのインスタンスを作成し、ネイティブクラスのインスタンスに ワーパ経由でアクセスし、COMクラスに渡すことにしましたC#クライアントで作成されます。問題は、ネイティブオブジェクトポインタ(IntPtrとして)をCOMクラスに渡すときに、ネイティブオブジェクトをその値に初期化しないことです。何が問題なの?マネージC++ラッパーを使ってネイティブオブジェクトをC#コードに戻す方法は?C++ラッパーを使用したマネージコードのネイティブC++インスタンス
//Natvie C++ class
class __declspec(dllexport) CConfiguration
{
public :
CConfiguration(void);
virtual ~CConfiguration(void);
void SetIPAddress(const char *IPAddress);
void SetPort(const char*Port);
void GetIPAddress(char *IPAddress);
void GetPort(char *Port);
Private:
std::string IPAddress;
std::string Port;
}
//Managed C++ Class
public ref class ManagedConfigruation
{
public :
ManagedConfigruation(){}
~ManagedConfigruation(){}
CConfiguration *myConfiguration;
IntPtr GetObjectOfConfigurationPtr();
}
IntPtr ManagedConfigruation::GetObjectOfConfigurationPtr()
{
myConfiguration = new CConfiguration();
myConfiguration.SetIPAddress("127.0.0.1");
myConfiguration.SetPort("6200");
//Convert native object to IntPtr and return to C# class
return System::IntPtr(myConfiguration);
};
//C# class on client exe
public class CSharpClass
{
//Wrapper of Managed C++ class
ManagedConfiguration objManagedConfiguration = new ManagedConfiguration();
IntPtr objPtr = objManagedConfiguration.GetObjectOfConfigurationPtr();
//Belwoo COMObject needs object of type CConfiguration native C++ class
COMObject.Initialize(objPtr); //Here is the problem object does not contain anything
}
'COMObject.Initialize(objPtr)'を読んではいけませんか? –
おかげでそれを修正しました –