1
特に、GUIDタイプのマーシャリングに関して、C#でのC++インターフェイスの実装が正しいかどうかは誰にも分かりません。C#インターフェイスを実装しているC#COMアセンブリ
元C++我々が実装している:
[
object,
pointer_default(unique),
uuid(Z703B6E9-A050-4C3C-A050-6A5F4EE32767)
]
interface IThing: IUnknown
{
[propget] HRESULT Prop1([out, retval] GUID* prop1);
[propget] HRESULT Prop2([out, retval] EnumProp2* prop2);
[propget] HRESULT Prop3([out, retval] HSTRING* prop3);
};
私たちのC#のCOMアセンブリで変換されたインタフェース:
[ComVisible(true), Guid("Z703B6E9-A050-4C3C-A050-6A5F4EE32767"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IThing
{
Guid Prop1 { get; }
EnumProp2 Prop2 { get; }
string Prop3 { get; }
}
具象クラス:
public class Thing : IThing
{
public Thing(Guid prop1, EnumProp2 prop2, string prop3)
{
Prop1 = prop1;
Prop2 = prop2;
Prop3 = prop3;
}
public Guid Prop1 { get; }
public EnumProp2 Prop2 { get; }
public string Prop3 { get; }
}
のGuid構造とGUIDの定義が異なるグループ分けを持っていますが、彼らは両方とも16バイト長だとバイトが一貫して順序付けられているとして、彼らは「バイナリ互換性」です:のhttp:// stackoverflowの.com/a/14891293/1132334 だからうまくいくはずです。 ComVisibleインターフェースが間違っていると思われる理由はありますか?ちょうどそれをテストできますか? –
dlatikay
OKは 'Guid.ToByteArray'を使って得ることができるバイト[16]のように見えます。 [参照元](https://referencesource.microsoft.com/#mscorlib/system/guid.cs,b622ef5f6b76c10a)は、 'Guid'構造体が複雑な型であり、生のビットを公開していないことを示しています。 – dlatikay