C# 结构的属性在 COM 和 VB6 中获得不可用的名称?
Properties of C# structs get unusable names in COM and VB6?
我的 C# 代码有一个 struct
,我正在将其导出到 COM。此结构的属性通过奇怪的名称出现,这些名称甚至在 VB6 中都不是有效语法,因此无法访问它们。
有什么方法可以让它们以正常可用的名称导出吗?我是否缺少某个属性或其他内容?
COM/VB6中名称的格式为:
<original_name>k__BackingField
我的 C# 代码中只有 original_name
部分。
我只能在 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 导出过程。
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
。您可以在此处找到有关结构的更多信息:
我的 C# 代码有一个 struct
,我正在将其导出到 COM。此结构的属性通过奇怪的名称出现,这些名称甚至在 VB6 中都不是有效语法,因此无法访问它们。
有什么方法可以让它们以正常可用的名称导出吗?我是否缺少某个属性或其他内容?
COM/VB6中名称的格式为:
<original_name>k__BackingField
我的 C# 代码中只有 original_name
部分。
我只能在 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 导出过程。
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
。您可以在此处找到有关结构的更多信息: