2017-03-12 3 views
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; } 
} 
+0

のGuid構造とGUIDの定義が異なるグループ分けを持っていますが、彼らは両方とも16バイト長だとバイトが一貫して順序付けられているとして、彼らは「バイナリ互換性」です:のhttp:// stackoverflowの.com/a/14891293/1132334 だからうまくいくはずです。 ComVisibleインターフェースが間違っていると思われる理由はありますか?ちょうどそれをテストできますか? – dlatikay

+0

OKは 'Guid.ToByteArray'を使って得ることができるバイト[16]のように見えます。 [参照元](https://referencesource.microsoft.com/#mscorlib/system/guid.cs,b622ef5f6b76c10a)は、 'Guid'構造体が複雑な型であり、生のビットを公開していないことを示しています。 – dlatikay

答えて

1

それは問題が判明実際にGuid構造体をマーシャリングしていませんでしたが、stringです。

管理CLRヒープからアンマネージヒープに文字列を移動すると、既定のマーシャリングタイプはUnmanagedType.BStr(Unicode文字列、長さプレフィックス)になります。この場合、ホストアプリケーションには異なるマーシャリングが必要ですタイプ:C#のの

public string Name { [return: MarshalAs(UnmanagedType.HString)]get; } 
関連する問題