2012-02-03 6 views
1

私たちは社内コードのC++ COMライブラリを持っています。現在、C#アプリケーションからライブラリを使用しています。正常に動作します。C++ COM DLLを標準のエクスポートされたメソッドに 'フラット化'するには? (C#で消費)

しかし、COMオブジェクトの登録と登録解除は面倒であり、管理者権限で登録を実行する必要があるため、Win7にアップグレードするユーザーにとっては問題になり始めています(Click-onceアプリケーションから直接行うことはできません)。

だから、COM経由でライブラリを使用する理由はありません(歴史的な理由からCOMとしてコード化されています)ので、単純なエクスポートとしてメソッドを公開するだけに変更したいと思います。

最初の試みは、COMクラスの横にあるメソッドを公開することでした。 DLLを調べるための適切なツールを使って上手く見えます。

ここで、VSでCOM参照を削除し、参照参照ダイアログで単に '参照'するだけでdllをインクルードすると、COMオブジェクトとして扱われ、dllは期待どおり出力に含まれません。

COMライブラリをシンプルなDLLとして使用するのは「違法ですか?この問題を解決する最良の方法は何ですか?

ありがとうございました!

アンダース、デンマーク

+0

したがって、COMの使用をやめて、P/Invokeを使い始めたいですか? – crashmstr

答えて

4

に設定埋め込み相互運用型を持っている必要がありますもしそれがCOMではなかったら。 COMと同じように、それを認識してCOMオブジェクトにロードします。

最も簡単な解決策は、おそらく登録不要のCOMを使用することです。つまり、実際に登録する必要はなく、アプリケーションと一緒にDLLを展開できますが、それでもCOMオブジェクトとして話します。これは、マニフェストファイルを操作する場合に過ぎません。

hereでツールを試してください。マニフェストの生成に役立ちます。また、登録無料のCOMの検索もできます。

+0

ええ、登録無料のCOMもお勧めします。生の関数を使用することは可能ですが、C#のシグネチャを手動でPInvokeシグネチャに変換する必要があります。そのために「参照の追加」を使用することはできません。その理由は、通常のDLLには(エクスポートされた関数の名前以外の)メタデータがないためです。 C/C++では、DLLの使用に役立つヘッダーがありますが、C#ではそれらを使用できないため、関数シグネチャの内容を伝える必要があります。インポートするタイプライブラリはありません(これは、COM DLLに追加参照が使用するものです)。 – Sven

1

出力にDLLを持っている、あなたは本当の

あなたも、DLLを追加するために[参照の追加]ダイアログを使用することはできません

more on this from MS

+0

それはまだCOMを使用しているように聞こえる...? – crashmstr

+0

@crashmstrまあ、はい。私は、質問を正しく理解していなかったと思います。 – Igarioshka

0

具体的には、管理者権限が必要な理由を知っていますか? COM登録の場合は、HKCRの代わりにHKCU \ Software \ ClassesにDLLを登録してみてください。

関連する問題