我正在用C#编写一个类库(IE BHO),目前正在与我认为来自REGASM生成的注册表项的大量垃圾输出进行争论。

简短版本是这样的:我只想向IE(以及COM的其余部分)公开一些类(目前:ONE类)。只有一个类具有ClassInterfaceAttribute和GUID设置,我可以测试该加载项仅需要此类的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可见的。所以首先要考虑将它们设置为内部,如果你真的需要它们,公开将它们隐藏在COM中,使用ComVisible。

其他提示

尝试使用/ regfile开关 - 这将输出一个reg文件,而不是直接将所有类名写入注册表。

如果有.reg文件,则可以删除不希望添加到目标系统注册表的任何条目,并仅将这些值部署到目标计算机。根据您选择部署软件的方式,这可能会更容易,您不必更改任何类型的代码。

事实上,如果您无法访问源代码,这将是实现此目的的唯一方法。

我写了一个有相同问题的COM组件。

我将所有非COM函数分离为一个单独的帮助器DLL。 COM DLL仅包含需要注册的代码。其他所有内容都通过帮助程序DLL访问。

我发现这是一种简单的方法,可以确保将来的代码不会被意外地标记为 public 而不是 internal 并显示在注册表中。

在AssemblyInfo文件中将ComVisible属性设置为false,并仅为所需的类设置应用ComVisible。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top