3

私は C# でクラス ライブラリ (IE BHO) を作成しており、現在、REGASM の生成されたレジストリ キーからの不要な出力と思われる大量のものと格闘しています。

短いバージョンは次のとおりです。少数のクラス (現在は 1 つのクラス) を IE (および残りの COM) に公開したいだけです。ClassInterfaceAttribute と GUID がセットされているクラスは 1 つだけで、アドオンがこのクラスの COM レジストリ キーのみを必要とすることをテストできますが、REGASM はプロジェクト全体のすべてのクラスの GUID とレジストリ キーを生成します。

クラス名が絶対に存在する必要がない限り、ユーザーのレジストリにクラス名を配置したくないので、これは面倒でやや不安です。

公平を期すために、IEのデバッグブラックホールを回避するために、同じソリューションの別のプロジェクトのドライバーアプリでそれらを使用しているため、これらの他のクラスの多くはパブリックとしてマークされています...

私はまだ一般的に(特に.Netに関連して)COMに対して非常にグリーンであり、他のすべてのクラスをレガズムから隠す最良の方法は何だろうかと思っていましたか? または、少なくとも、COM フラグを設定していないのに、パブリックとマークされているにもかかわらず、これらのクラスが表示されるのはなぜですか?

ありがとう!

4

4 に答える 4

5

internal修飾子を持つ必要がないものには、アクセス修飾子を使用しますpublic。本当にアクセスが必要なものについては、publicComVisible 属性を使用して部分的に非表示にします。

例えば:

[ComVisible(false)]
public class ClassToHide {
    //whatever
};

public class ClassToExpose {

     public void MethodToExpose() {}

     [ComVisible(false)]
     public void MethodToHide() {}
};

すべてのパブリック クラスのすべてのパブリック メンバー関数とメンバー変数は、既定で COM から参照できます。したがって、最初にそれらを内部にすることを考えてください。本当に公開する必要がある場合は、ComVisible を使用して COM から非表示にします。

于 2009-06-19T06:27:51.690 に答える
2

同じ問題のあるCOMコンポーネントを作成しました。

COM以外のすべての関数を個別のヘルパーDLLに分離しました。COM DLLには、登録する必要のあるコードのみが含まれています。他のすべては、ヘルパーDLLを介してアクセスされます。

public将来のコードがレジストリではなくとして誤ってマークinternalされてレジストリに表示されないようにする簡単な方法を見つけました。

于 2009-06-22T05:41:26.620 に答える
2

/regfile スイッチを使用してみてください。これにより、すべてのクラス名をレジストリに直接書き込むのではなく、reg ファイルが出力されます。

.reg ファイルがあれば、ターゲット システムのレジストリに追加したくないエントリを削除し、それらの値のみをターゲット マシンに展開できます。ソフトウェアのデプロイ方法によっては、この方が簡単な場合があり、どのタイプのコードも変更する必要はありません。

実際、ソースコードにアクセスできない場合、これがこれを達成する唯一の方法です。

于 2009-06-19T08:21:20.633 に答える
1

AssemblyInfoファイルでComVisible属性をfalseに設定し、目的のクラスにのみComVisibleを適用するように設定します。

于 2010-10-03T17:41:05.127 に答える