3

わかりました、私は夢中になります。シンプルな .net アセンブリを COM オブジェクトとして使用できるようにしようとしましたが、うまくいきません。私は多くの異なるアプローチを試みてきましたが、どれもうまくいきません。これまでのところ、私が持っている最も近いものは、属性、インターフェース、手動登録などの量が最も少ないものです.

次のようなテストとして vbscript があります。

Dim o
o = CreateObject("MyNamespace.MyClass")
msgbox o.Test()

私のC#コードは次のようになります:

using System;
using System.Runtime.InteropServices;
namespace MyNamespace 
{
  [ProgId("MyNamespace.MyClass")]
  public class MyClass
  {
    public string Test()
    {
       return "teststring";
    }
  }
}

私のプロジェクト(VS2008)では、「アセンブリCOMを表示する」を選択しました。これにより、AssemblyInfo.csに属性が追加され、「COM相互運用に登録する」もチェックされました。

ProgId は実際には違いがないことがわかります (私の場合はとにかく) - 実際の名前空間 + クラス名を指定している限り、それをオーバーライドすることができます。

問題は、私の CreateObject はうまくいきますが、メソッド Test() が見つからないということです。実際、dll を取得して tlb を抽出すると、メソッドがまったく表示されないと予想されます。

私が得るエラーはこれです:

C:\inetpub\wwwroot\ASPTest\testrun.vbs(3, 1) Microsoft VBScript ランタイム エラー: オブジェクトはこのプロパティまたはメソッドをサポートしていません: 'Test'

フィードバックをいただければ幸いですが、私が試したことをお知らせします。クラスで Guid と AttributeGuid をいじり、クラスで明示的に COMVisible を定義しました。

最後の注意 - ほとんどのテストは署名されていないアセンブリを中心に展開されましたが、エラーを特定しようとして、ストロングネーム/キーでも試しましたが、何もしませんでした。

誰でも問題を見つけるのを手伝ってくれますか?

4

5 に答える 5

2

Windows 7 RC 64 ビットを実行していると言いましたか?

それは、私の VS が正しく機能していないことを説明しているのかもしれないと思います: http://kbalertz.com/956933/Issues-building-project-assembly.aspx VS は 64 ビットではなく 32 ビット バージョンのレジストリを使用しているようです...

于 2009-06-16T12:36:36.917 に答える
1

私は最初から始めて、プロジェクトのCOM相互運用に関するものをすべて削除し、次に追加しました

[Guid(...some guid...)]
[ComVisible(true)]

MyClass で、strongname を追加しました (AssemblyInfo.cs で定義する代わりに、プロジェクト設定を使用して設定しました)。

アセンブリをコンパイルしたときに、ファイルを別の場所にコピーしました。

regasm MyNamespace.MyClass.dll /codebase /regfile

次に、レジストリエントリを実行して受け入れました。

これにより機能しました-変更を加えるたびに、ファイルを再コンパイルして古いものにコピーし(登録解除せず)、次のことのみを行います。

regasm MyNamespace.MyClass.dll /codebase

... それだけです。MyClass に加えた変更は、vbscript と ASP ページにすぐに表示されます。

于 2009-06-17T06:41:02.360 に答える
0

これは私のために働きます:

using System;
using System.Runtime.InteropServices;
namespace MyNamespace
{

    [GuidAttribute("8DDE02DF-B31C-4d91-98A7-C64444701985")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class clsCOMWraper
    {
       public string Test()
      {
         return "teststring";
      }
    }
}

これらのアセンブリは署名する必要があります。

、regasm/codebaseに登録する

于 2009-06-16T12:39:17.193 に答える
0

メソッドを持つインターフェイスを定義し、そのインターフェイスを実装する必要はありませんか?

于 2009-06-16T12:25:52.383 に答える
0

クラスのコンストラクターが表示されません。COM Interop が COM インターフェイスを正常に生成するには、デフォルトのコンストラクター (パラメーターなし) が必要です。

コンストラクターを追加してみて、それが機能するかどうかを確認してください。

于 2009-06-29T20:04:44.743 に答える