为什么它在为接口创建实例时在 C# 中工作
本文关键字:实例 工作 创建 接口 为什么 | 更新日期: 2023-09-27 17:55:25
编辑:我找到了关于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;
命名空间 安捷伦.安捷伦34980A.互操作
{
// 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. }
}
安捷伦34980A定义部件
使用 System.Runtime.InteropServices;
命名空间 安捷伦.安捷伦34980A.互操作
{
// Agilent34980A driver class. [Guid("07678A7D-048A-42A6-8884-6CC8C575BD1F")] [CoClass(typeof(Agilent34980AClass))] public interface Agilent34980A : IAgilent34980A2 { }
}
和 IIvi 驱动程序定义部分
使用系统;
使用 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. }
实际上,您可以通过同时具有 [CoClass]
和 [Guid]
属性的 co-class 创建一个接口实例。
这使您可以:
[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();
}
不能在 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();
有效,因为它意味着"变量'host'是对某个对象的引用,该对象是实现IAgilent34980A接口的类的实例"。C# 非平凡对象是引用类型,因此,这是有效的。