0

編集:C#とCOMに関する相対ページを見つけましたC#コンパイラはCOMタイプをどのように検出しますか?

タイトルのように、C#のプログラムをIronPythonに変換しているときに、クラスのインスタンスを作成できませんでした。

元のC#プログラム:IAgilent34980A2 host = new Agilent34980A();

書き直されたIronPythonプログラム:host = Agilent34980A()

C#プログラムは正常に機能しますが、IronPythonプログラムは次のようなエラーを受け取ります。

TypeError:抽象的であるため、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();

「変数'host'は、IAgilent34980Aインターフェイスを実装するクラスのインスタンスであるオブジェクトへの参照である」という意味で機能します。C#の重要なオブジェクトは参照型であるため、これは有効です。

于 2013-01-22T09:44:47.873 に答える