COM相互運用性のために.netアセンブリを登録しても、メソッドが公開されません
-
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インターフェイスを正常に生成するために、デフォルトのコンストラクター(パラメーターなし)を必要とします。
コンストラクタを追加して、動作するかどうかを確認してください。
このリンクが完全に機能することを確認し、私はそれに従って、"オブジェクトはこのプロパティまたはメソッドをサポートしていません"のようなエラーに対して完璧な解決策を提供します コードプロジェクトヘルプ