.netプロジェクトでvb6 dll参照にReg-Free COMを使用するにはどうすればよいですか?
-
03-07-2019 - |
質問
私は長い間この問題を解決しようとしてきましたが、何も機能していないようです。
vb6で作成されたCOM DLLがあります。 .netでこのDLLへの参照を追加し、参照で 'isolated'および 'copy local'プロパティをtrueに設定します。どうやらこれはreg-free comを有効にすることになっています。
しかし、動作しません。別のコンピューターで試すか、またはregsvr32でDLLの登録を解除すると、DLLにアクセスしようとすると例外がスローされます(基本的に、目的のcomクラスが存在しないと言います)。 DLLとマニフェストファイルはEXEと同じフォルダーにありますが、明らかに完全に無視されます。
間違っているのは何ですか?私はこれについてたくさんの散らばった記事を読みましたが、それらのどれも私に実用的な解決策を与えません。私はビジュアルスタジオをいじくり回していませんでした。 make-my-manifestを少しいじりましたが、機能しませんでした(テストプロジェクトでも)。
解決
私は非UIスレッドでcomクラスを作成して使用していました。どうやらvb6 DLLのReg-Free comはそのような状況では機能しません。このテストコードはそれを示しています:
Private Sub RunTest() Handles Button1.Click
Try
Dim x As New RegTestProject.RegTestCall
MsgBox(x.RegTestFunction())
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub RunThreadedTest() Handles Button2.Click
'fails if reg-free COM is used'
Dim t As New Threading.Thread(AddressOf RunTest)
t.Start()
End Sub
DLLを正常に登録してこれを実行すると、両方のテストが成功します。 reg-free comを使用すると、通常のテストはまだ成功しますが、スレッドテストは失敗します。これは回避策にとって大きな痛みになると思われます。
他のヒント
この方法でCOMコンポーネントを参照すると、ビルドするたびにCOMコンポーネントのインポートが行われると確信しています。つまり、プロジェクトをビルドするすべてのマシンで、COMコンポーネントを従来の方法で登録する必要があります。
登録の使用を説明するリンク無料のcom相互運用。既にこれを行っている場合は、マニフェストファイルを投稿してください。タイプミスがあるかもしれません。
編集
アプリを新しいマシンで初めて実行するときにdllを登録する方が簡単かもしれません。登録無料のcom interoptはWindows XP以降でのみ利用可能ですので、恐竜をターゲットにした場合は動作しません。
トラブルシューティングセクションからの抜粋ですMSDN 記事(reg-free COM)。すでに見たことがあるならおologiesびします。良いニュースは、あなたがすでに手順の途中にいることです。 Windows Server 2003で問題を再現することをお勧めします( Virtual PC ?)そして、イベントログが役立ちます。
最初に取得する... 登録済みサーバー。その後、登録解除 サーバーとエラーを確認します メッセージはあなたが期待したものです。そして 最後に...マニフェストを作成してデプロイする ファイル。このようにしてトラブルシューティング 努力...に限定されます マニフェストファイルの構造(および アセンブリの正しい埋め込み あなたがそうすることを選択した場合はマニフェスト)。
登録不要のトラブルシューティングを行う場合 COMの問題、イベントビューアー Windows Server 2003 はあなたの友達です... システムイベントログでCOMサーバーからのイベントを確認します。 私はあなたが見ることをお勧めしません Windows XPイベントログ... それは常に含まれます メッセージ...助けにはならない 問題を特定します。