我在C#编写一个类库(IE BHO),目前与大体积的东西,我认为是垃圾输出REGASM的生成注册表项来扯皮。
简短的版本是这样的:我只是想揭露类极少数(目前为:一类)IE浏览器(和COM的其余部分)。 只有一类具有ClassInterfaceAttribute和GUID的东西集,我可以测试该插件只需要这个类的COM注册表项 - 然而,REGASM产生的GUID和注册表项,在整个项目中的每个类。
这是烦人的,有点不安,因为我不希望我的类名坐在用户的注册表,除非在万不得已的在那里做。
为了公平起见,许多那些其他类的,因为我在驱动程序的应用程序在同一个解决方案中使用它们从另一个项目,来解决IE的调试黑洞被标记公共...
我还是很绿色COM一般(特别是与.NET),我想知道什么是隐藏regasm我的所有其他类的最佳方式? 或者,至少,为什么这些类 - 即使它们标记为公共的 - 都出现了,当我还没有设置任何对他们的COM的标志?
谢谢!
使用internal
访问修饰符的东西,并不需要有public
修改。 对于东西,真正需要的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访问。
我发现一个简单的方法,以确保将来的代码不会被意外地标记为public
,而不是internal
和注册表中显示出来。
设置标记有ComVisible特性属性中集信息档案造假,并设置申请标记有ComVisible特性仅为所需类。