Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承接口和COM互操作最佳实践?_C#_Com Interop - Fatal编程技术网

C# 继承接口和COM互操作最佳实践?

C# 继承接口和COM互操作最佳实践?,c#,com-interop,C#,Com Interop,我有一个问题不是一个直接的编码问题,所以我不确定这是问的地方。如果没有,请建议在哪里询问更好 我有一个向COM公开的.Net程序集。它使用一个基类和几个派生类,所有这些都通过接口公开 基类: public abstract class BaseFoo : IBaseFoo { public abstract int X { get; } public abstract int Y { get; } } 带接口: public interface IBaseFoo { i

我有一个问题不是一个直接的编码问题,所以我不确定这是问的地方。如果没有,请建议在哪里询问更好

我有一个向COM公开的.Net程序集。它使用一个基类和几个派生类,所有这些都通过接口公开

基类:

public abstract class BaseFoo : IBaseFoo
{
    public abstract int X { get; }
    public abstract int Y { get; }
}
带接口:

public interface IBaseFoo
{
    int X { get; }
    int Y { get; }
}
派生类是COM可见的,并添加了其他功能

[ComVisible(true)]
[Guid("123-456-789")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IFooA))]
public class FooA : BaseFoo, IFooA
{
    public override int X { get; }
    public override int Y { get; }
    public string Z { get; set; }
}
该接口向COM公开:

[ComVisible(true)]
[Guid("321-654-987")]
public interface IFooA : IBaseFoo
{
string Z { get; set; }
}
在这一点上,使用过COM的人会注意到一个问题
IFooA
将向COM公开,但它不会公开来自
IBaseFoo
的任何内容,因为继承的接口不会向COM公开

为了克服这一点,我做了以下几点:

[ComVisible(true)]
[Guid("321-654-987")]
public interface IFooA : IBaseFoo
{
    new int X { get; }
    new int Y { get; }
    public string Z { get; set; }
}
这最后让我想到了我的问题:我不喜欢那里的
new
。重写继承的接口感觉是错误的。创建一个单独的接口
IComFooA
,让
FooA
从中继承,并将该接口公开给COM,即cleanup
IFooA
,这样做是否更好?本质上:你会建议上面或下面的设置,为什么

[ComVisible(true)]
[Guid("123-456-789")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IComFooA))]
public class FooA : BaseFoo, IFooA, IComFooA
{
    public override int X { get; }
    public override int Y { get; }
    public string Z { get; set; }
}
IComFooA
为:

[ComVisible(true)]
[Guid("321-654-987")]
public interface IComFooA
{
    int X { get; }
    int Y { get; }
    public string Z { get; set; }
}
IFooA
只是:

public interface IFooA : IBaseFoo
{
    public string Z { get; set; }
}

我有点惊讶,没有人对此做出回应。这两种方法都有很多问题。对此肯定有意见吗?第一个示例只是将继承的接口展平,第二个示例将多个接口引入到同一事物中。我倾向于第二种解决方案,但我非常感谢专业人士的建议。“继承接口”的概念不是一个好的思维模式,它是由C#语法带来的幻觉。coclass实际上实现了这两个接口,客户端代码必须使用QueryInterface()来获取非默认接口IBaseFoo。也许是你做的,这并不明显,也不总是可能的。例如,脚本语言和旧的VB版本不支持这一点。一个致命的缺陷,IBaseFoo缺少[ComVisible(true)]。我个人使用C#派生词和new关键字。这是唯一一个使用COM接口的C#派生。感谢您的见解。我的意图确实是将这些接口公开给旧的VB版本和脚本语言,简单地说,它们只需要能够调用我的程序集就可以了。