C#:COM DLLのすべてのクラスのレジストリエントリを生成するRegasm?
質問
C#でクラスライブラリ(IE BHO)を書いていますが、現在、REGASMが生成したレジストリキーからのジャンク出力と思われるものの大部分を取り扱っています。
短いバージョンはこれです:少数のクラス(現在は1つのクラス)をIE(およびCOMの残りの部分)に公開したいだけです。 ClassInterfaceAttributeとGUIDが設定されているクラスは1つだけであり、アドオンではこのクラスのCOMレジストリキーのみが必要であることをテストできますが、REGASMはプロジェクト全体のすべてのクラスのGUIDとレジストリキーを生成します。
これは、ユーザーのレジストリに絶対に存在しない限り、クラス名をユーザーのレジストリに配置したくないため、迷惑でやや面倒です。
公平を期すために、これらのクラスの多くはパブリックとマークされています。同じソリューションの別のプロジェクトのドライバーアプリでIEのデバッグブラックホールを回避するために使用しているためです...
私はまだCOM全般(特に.Netに関連する)に対して非常に環境に優しいので、他のすべてのクラスをレガズムから隠す最良の方法は何だと思いましたか?または、少なくとも、これらのクラスは、パブリックとしてマークされていても、COMフラグを設定していないときに表示されるのはなぜですか?
ありがとう!
解決
public
修飾子を必要としないものには、 internal
アクセス修飾子を使用します。 public
アクセスが本当に必要なものについては、ComVisible属性を使用して部分的に非表示にします。
例:
[ComVisible(false)]
public class ClassToHide {
//whatever
};
public class ClassToExpose {
public void MethodToExpose() {}
[ComVisible(false)]
public void MethodToHide() {}
};
すべてのパブリックメンバー関数およびすべてのパブリッククラスのメンバー変数は、デフォルトでCOMに表示されます。したがって、最初にそれらを内部にすることを検討し、本当に必要な場合は、ComVisibleを使用してCOMから非表示にします。
他のヒント
/ regfileスイッチを使用してください-これにより、すべてのクラス名をレジストリに直接書き込むのではなく、regファイルが出力されます。
.regファイルがある場合、ターゲットシステムレジストリに追加したくないエントリを削除し、それらの値のみをターゲットマシンに展開できます。ソフトウェアの展開方法に応じて、これは簡単な場合があり、どのタイプのコードも変更する必要はありません。
実際、ソースコードにアクセスできない場合、これが唯一の方法です。
同じ問題を持つCOMコンポーネントを作成しました。
すべての非COM関数を個別のヘルパーDLLに分離しました。 COM DLLには、登録する必要があるコードのみが含まれています。他のすべてはヘルパーDLLを介してアクセスされます。
将来のコードが誤って internal
ではなく public
としてマークされ、レジストリに表示されないようにする簡単な方法を見つけました。
AssemblyInfoファイルでComVisible属性をfalseに設定し、目的のクラスのみにComVisibleを適用するように設定します。