2009-06-16 4 views
3

さて、私は狂ってしまいます。私は単純な.netアセンブリをCOMオブジェクトとして使用するために表示しようとしていますが、動作していません。私はたくさんの異なるアプローチを試してきましたが、どれもうまくいきません。COM相互運用性のために私の.netアセンブリを登録しても、私のメソッドは公開されません。

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

私のC#コード:これまでのところ私が持っている最も近い、私はこのようになりますテストとしてVBScriptを持っているなど、手動で登録し、

属性、インタフェースの最低額を有するものです - 私のAssemblyInfo.csに属性を追加し、私はまた、「COM相互運用機能のために登録する」をチェックしている私のプロジェクトで

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

(VS2008)私が選択した「組立COMが見えてください」:このようになります。

私は実際の名前空間+クラス名を指定する限り、ProgIdが実際には何の違いもないことが分かります。

問題は - 私のCreateObjectはうまくいっていますが、Test()メソッドが見つかりません。実際には、私はDLLを取って、tlbを抽出し、私はすべての方法が表示されないことを期待する場合。

私が手にエラーがこれです:

C:\inetpub\wwwroot\ASPTest\testrun.vbs(3, 1) Microsoft VBScript runtime error: Object doesn't support this property or method: 'Test'

私は、任意のフィードバックをしてみたいが、ちょうど私がしようとしてきたものを知っているように。私はクラスでGUIDとAttributeGuidを使いこなし、COMVisibleをクラスに明示的に定義しました。私はCOM相互運用機能に登録せず、代わりにregasm/codebase/regfileを実行しました。

私のテストのほとんどは、署名されていないアセンブリの周りを回っていますが、私はstrongname/keyで試したエラーを特定しようとしましたが、何もしませんでした。

誰でも問題を見つけるのを手助けできますか?

+0

あなたは厳密な名前を持つアセンブリに署名した「オブジェクトはこのプロパティまたはメソッドをサポートしていません」のようなエラーを超える完璧なソリューションを提供します(SN .exeユーティリティ)? – sharptooth

+0

私は強い名前(sn.exeでキーを作成する)と一緒に試してみました。実際にatm私はアセンブリに署名しない場合、さらに私が得る。 –

答えて

1

に登録するには、私は、MyClassの上

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

を追加し、私が使用厳密な名前を(追加しましたAssemblyInfo.csで定義するのではなく、設定するプロジェクト設定。私はアセンブリをコンパイル

は、私が走った私は、

regasm MyNamespace.MyClass.dll /codebase /regfile 

をした別の場所にファイルをコピーし、レジストリエントリを受け入れました。

これは、それが働かせた - 私はちょうど古い上のファイルを再コンパイルし、コピーの変更(無登録解除)を行い、その後、私はやるたび:

regasm MyNamespace.MyClass.dll /codebase 

...とそれはそれだ - 私が行った変更をMyClassには、私のVBスクリプトと私のASPページで即座に見ることができます。

0

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

+0

regasm/codebase/regfileを使っていて、regfileを実行していたので、私はそれがなくても動作しているのが分かりました。しかし、明示的なインターフェイスを定義して動作させる例があれば、それを見てうれしく思います:) –

2

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

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

+0

Hrm私はプロジェクトが32ビットで構築されていると思うので、VSが32ビットセクションに登録するのは大丈夫です。 .. –

+0

私の見落としによく似ています。 VSが32ビットであるにもかかわらずVSがsystem32/regsvr32の64ビットバージョンをスピンアップしてハイブの64ビット部分にtlbを登録できなかった理由はありません。そのような選択肢をUIに追加するか、ビルドのCPUターゲット値を使用して、ハイブセクションのどちらかまたは両方を登録するかを決定することに意味があります。 – AnthonyWJones

+0

Anthony:そうです。 –

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

本書には署名が必要です。

ザ・、私は最初から開始し、私のプロジェクトでCOM相互運用機能に関する何かを取り出します。regasm /コードベース

+0

ただし、ClassInterfaceでのAutoDualの使用は、古いバインディングクライアントで間違ったメソッドを呼び出す可能性があります。 – AnthonyWJones

+0

私はこれを試しましたが、今はオブジェクトを作成しません。代わりにCreateObject()行で失敗します。私はNamespace.Classが正しいかどうかをダブルチェックしました... –

+0

sidenote - オブジェクトを作成しようとするとCreateObjectが失敗するGuidAttributeを追加する度に、一度削除します。 (私が投稿したエラーのように見つけることができない)メソッドを呼び出します。 –

0

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

コンストラクタを追加して、動作するかどうかを確認してください。このリンクは、それは完全に私はそれに従う仕事と

+0

.netフレームワークは、私がそれを供給しなければ、デフォルトの空のコンストラクタを提供します。私はそれを試してみましたが、私のresharperプラグインはそれを灰色にして、それが冗長であることを宣言することを意味します。 –

関連する問題