2

ComVisible クラスを作成しました。

[Guid("73a3f91f-baa9-46ab-94b8-e526c22054a4"), ComVisible(true)]
public interface ITest
{
    void Foo();
}

[Guid("99f72d92-b302-4fde-89bb-2dac899f5a48"), ComVisible(true)]
public class Class1 : ITest
{
    public void Foo() { }
}

経由で登録しました

regasm ComClassTest.dll /tlb:ComClassTest.tlb

レジストリに。Silverlight 4 のブラウザ外の昇格された信頼アプリケーションでそれを呼び出そうとすると、次のようになります。

var foo = AutomationFactory.CreateObject("ComClassTest.Class1");

「{System.Exception: 指定された ProgID のオブジェクト インスタンスを作成できませんでした。」という例外が発生します。

ただし、ComClassTest をコピーすると、例外なしで AutomationFactory.CreateObject("Word.Application") を呼び出し、通常の C# コンソール アプリケーションで Activator.CreateInstance(Type.GetTypeFromProgID("ComClassTest.Class1")) を呼び出すことができます。 .dll を bin ディレクトリに追加します。

私は何を忘れましたか?

4

1 に答える 1

0

最初に行うことは、VBScript などの別の場所からオブジェクトを作成できることをテストすることです。次の内容で .vbs ファイルを作成します。

o = CreateObject("ComClassTest.Class1")

それでもエラーが発生しない場合は、SL OOB が特に問題を抱えている可能性があります。それ以外の場合、問題は実際には Silverlight とはまったく関係ありません。

COM コードに次の変更を加えることを検討してください。

  • 多くの場合ComVisible(true)、アセンブリ レベルで指定する方が簡単です。これは、[アセンブリ情報] ダイアログのプロジェクト プロパティの [アプリケーション] タブから実行できます。また、Visual Studio でアセンブリを COM に登録し、プロジェクト プロパティの [ビルド] タブにあるオプションを使用してビルドすることもできます。

  • ComInterfaceType公開したいものについて具体的に説明することをお勧めします。

  • クラス インターフェイスを直接公開すると、通常、定義したインターフェイスのみを使用し、これをクラスのデフォルト インターフェイスにする場合、事態は非常に厄介になります。さらに、クラスの既定のインターフェイスについては、COM 命名規則に固執する方がよいでしょう。

  • 最後に (そしておそらくあなたの場合は決定的に)、クラスに使用する ProgId について明示することをお勧めします。

上記を適用すると、次のようになります。

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("73a3f91f-baa9-46ab-94b8-e526c22054a4")]
public interface _Class1
{
    void Foo();
}

[ClassInterface(ClassInterfaceType.None)] 
[Guid("99f72d92-b302-4fde-89bb-2dac899f5a48")]
[ProgId("ComClassTest.Class1")]
public class Class1 : _Class1
{
    public void Foo() { }
}
于 2010-12-18T18:43:30.613 に答える