3

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

简短的版本是这样的:我只想向 IE(以及 COM 的其余部分)公开少数类(目前:一个类)。只有一个类设置了 ClassInterfaceAttribute 和 GUID,我可以测试该插件只需要该类的 COM 注册表项——然而,REGASM 为整个项目中的每个类生成 GUID 和注册表项。

这很烦人而且有点令人不安,因为我不希望我的类名出现在用户的注册表中,除非他们绝对必须在那里。

公平地说,许多其他类被标记为公共,因为我在同一解决方案中另一个项目的驱动程序应用程序中使用它们,以解决 IE 的调试黑洞......

总的来说,我对 COM 仍然很陌生(尤其是与 .Net 相关),我想知道隐藏我所有其他类以防止 regasm 的最佳方法是什么?或者,至少,当我没有为它们设置任何 COM 标志时,为什么这些类——即使它们被标记为公共——会出现?

谢谢!

4

4 回答 4

5

internal对不需要修饰符的东西使用访问public修饰符。对于真正需要public访问的内容,请使用 ComVisible 属性部分隐藏它。

例如:

[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

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

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

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

于 2009-06-19T08:21:20.633 回答
2

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

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

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

于 2009-06-22T05:41:26.620 回答
1

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

于 2010-10-03T17:41:05.127 回答