0

编辑:我找到了关于 C# 和 COM 的相关页面C# 编译器如何检测 COM 类型?

如标题所示,当我将 C# 中的程序转换为 IronPython 时,我无法创建类的实例。

原始 C# 程序:IAgilent34980A2 host = new Agilent34980A();

重写的 IronPython 程序:host = Agilent34980A()

C# 程序运行良好,而 IronPython 程序出现以下错误:

类型错误:无法创建 Agilent34980A 的实例,因为它是抽象的

实际上 Agilent34980A() 是一个接口,所以错误是合理的。

我的问题是为什么它在 C# 中有效?实例也不能在作为接口的 C# 中创建,对吧?

添加:

C# 代码来自测试机标记。

IAgilent34980A2 源代码定义部分如下:

使用 Ivi.Driver.Interop;

使用系统;

使用 System.Runtime.InteropServices;

命名空间 Agilent.Agilent34980A.Interop

{

  //     IAgilent34980A interface.

[TypeLibType(256)]
[Guid("07678A7D-048A-42A6-8884-6CC8C575BD1F")]
[InterfaceType(1)]
public interface IAgilent34980A2 : IIviDriver
{
   IAgilent34980AMeasurement Measurement { get; }
   IAgilent34980AVoltage Voltage { get; }
  //  There are some similar functions following.
}

}

Agilent34980A 定义部分

使用 System.Runtime.InteropServices;

命名空间 Agilent.Agilent34980A.Interop

{

  //     Agilent34980A driver class.
[Guid("07678A7D-048A-42A6-8884-6CC8C575BD1F")]
[CoClass(typeof(Agilent34980AClass))]
public interface Agilent34980A : IAgilent34980A2
{
}

}

和 IIviDriver 定义部分

使用系统;

使用 System.Runtime.InteropServices;

命名空间 Ivi.Driver.Interop

{

//     IVI Driver root interface
[TypeLibType(256)]
[InterfaceType(1)]
[Guid("47ED5184-A398-11D4-BA58-000064657374")]
public interface IIviDriver
{
   //     Pointer to the IIviDriverOperation interface
   [DispId(1610678272)]
   IIviDriverOperation DriverOperation { get; }
   
   //     Pointer to the IIviDriverIdentity interface
   [DispId(1610678273)]
   IIviDriverIdentity Identity { get; }
   //  There are some similar functions following.
}
4

2 回答 2

1

[CoClass]实际上,您可以通过具有和[Guid]属性的共同类创建一个接口实例。

这使您可以:

[Guid("000208D5-0000-0000-C000-000000000046")] // Anything
[CoClass(typeof(Foo))]
[ComImport]
public interface IFoo { void Bar(); }

public class Foo : IFoo { public void Bar() { return; } }

void Main()
{
    IFoo instance = new IFoo();
}
于 2013-01-22T09:55:50.523 回答
0

您不能在 C# 中创建接口的实例。示例代码:

void Main()
{
    var test = new ITest();
}

interface ITest {
    void Test();
}

会报编译错误:

Cannot create an instance of the abstract class or interface "UserQuery.ITest"

问题只是您的类未正确声明为库中的接口。

代码如下:

IAgilent34980A host = new Agilent34980();

有效,因为它意味着“变量'主机'是对某个对象的引用,该对象是实现 IAgilent34980A 接口的类的实例”。C# 非平凡对象是引用类型,因此这是有效的。

于 2013-01-22T09:44:47.873 回答