1

私の C# コードには、structCOM にエクスポートする があります。この構造体のプロパティは、VB6 では有効な構文でさえない奇妙な名前を使用しているため、アクセスできません。

これらを通常の使用可能な名前でエクスポートする方法はありますか? 属性か何かがありませんか?


COM / VB6 での名前の形式は次のとおりです。

<original_name>k__BackingField

original_name私のC#コードにはその部分だけがありました。

これらのクレイジーなプロパティ名は VB6 オブジェクト ブラウザでしか見ることができず、Intellisense では表示されません。

ビルド中の (少しサニタイズされた) コードは次のとおりです。

[Guid("....")]
[ComVisible(true)]
public struct MyStruct
{
    public string StringA { get; set; }
    public string StringB { get; set; }

    public MyStruct(string a, string b)
    {
        StringA = a;
        StringB = b;
    }

    ... // some other methods, no fields or properties
}

適切な測定のために、生成される IDL を次に示します。

typedef [uuid(....), version(1.0), custom(xxxx, MyNamespace.MyStruct)]
struct tagMyStruct {
    LPSTR <StringA>k__BackingField;
    LPSTR <StringB>k__BackingField;
} MyStruct;

OleView で表示されます。k__BackingField上記と同じものが含まれていることがわかります。したがって、これらの名前は C# の typelib エクスポート プロセスから来ているようです。

4

1 に答える 1

4

public string StringA { get; set; }は、次の短い形式にすぎません

private string _stringA_BackingField;
public string StringA
{
  get { return _stringA_BackingField; }
  set { _stringA_BackingField = value; }
}

また、COM 構造体にはフィールドのみが含まれ、プロパティは含まれないため、バッキング フィールドが表示されます。コードを次のように変更すると、例が機能するはずです。

[Guid("....")]
[ComVisible(true)]
public struct MyStruct
{
    public string StringA;
    public string StringB;
}

定義によると、struct型は通常、関連する変数の小さなグループをカプセル化するために使用される値型です。

プロパティまたはメソッドを提供する場合は、class. 構造体の詳細については、次を参照してください。

于 2019-09-06T22:05:17.687 に答える