COM相互運用性のために.netアセンブリを登録しても、メソッドが公開されません

StackOverflow https://stackoverflow.com/questions/1001129

  •  05-07-2019
  •  | 
  •  

質問

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

次のようなテストとして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を明示的に定義し、COM相互運用機能に登録せずに、代わりに/ codebase / regfileを実行しました。

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

誰かが問題を見つけるのを手伝ってくれませんか?

役に立ちましたか?

解決 2

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

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

MyClassおよびiに厳密な名前を追加しました(AssemblyInfo.csで定義する代わりに、プロジェクト設定を使用して設定しました。

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

regasm MyNamespace.MyClass.dll /codebase /regfile

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

これにより機能しました-変更を加えるたびに、古いファイルを再コンパイルしてコピーするだけで(登録解除はせず)、その後のみ:

regasm MyNamespace.MyClass.dll /codebase

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

他のヒント

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

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

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

これは私のために働く:

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";
      }
    }
}

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

the、regasm / codebaseに登録

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

コンストラクタを追加して、動作するかどうかを確認してください。

このリンクが完全に機能することを確認し、私はそれに従って、"オブジェクトはこのプロパティまたはメソッドをサポートしていません"のようなエラーに対して完璧な解決策を提供します コードプロジェクトヘルプ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top