如何创建通用的使用库

时间:2010-12-23 11:42:24

标签: c# .net winforms com activex

我有一个图像编辑器用户控件(c#.net v2.0)。它在数千台计算机中用作activex组件。我希望该组件也可用于Windows窗体和其他可能的用途。

对于activex用法,我在html代码中添加<object>标记,并使用clsid(静态guid)调用该组件。因此,如果我构建和分发更新的版本,它可以在不更改任何客户端代码的情况下工作。

我希望Windows窗体能够使用相同的分布式库。并且它们不应该引用特定版本,因此我可以在不更改使用它的程序的情况下更新组件。

我使用regasm注册com。但我不知道如何从视觉工作室引用它(比如用clsid引用?)

当我选择添加引用并选择COM选项卡时,可能是视觉stuido我shuld在列表中看到我的组件。

注意:我试图使用这些行将assemly添加到全局缓存中,但它没有用 - 或者我可以理解是否有任何更改:)

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\tlbexp" ImageEditorComp.dll /out:ImageEditorComp.tlb
regasm /tlb:ImageEditorComp.tlb ImageEditorComp.dll
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\gacutil" /I ImageEditorComp.dll

任何建议表示赞赏, 此致

2 个答案:

答案 0 :(得分:2)

这是不可能的,你将调用臭名昭着和可怕的DLL Hell问题。 COM中的一个难以理解的规则是,当你在公开可见的接口或它们的实现中进行重大更改时,你来更改公共接口上的[Guid]属性值。更改guid可确保在使用Regasm.exe时不会覆盖旧版组件的注册表项。使用您的组件但未重新编译以使用最新版本的现有程序将继续运行而不会出现问题。 DLL Hell的典型结果是像AccessViolation这样令人讨厌的硬件异常,非常难以排除故障。

这些都不适用于您的具体情况。试图通过COM使用组件是没有意义的。它是一个.NET程序集,只需直接添加对它的引用即可。实际上,IDE会阻止您添加对互操作库的引用。但不是.tlb。假设您正确递增[AssemblyVersion],GAC会让您远离DLL Hell。

答案 1 :(得分:0)

我想出了一个解决方案。

逐步解释:

1-创建具有com所需属性的组件(签署程序集,使用com的接口,使程序集可见)

在客户端计算机上

2-用regasm注册程序集(我建议也添加安全标志)。

3-使用gacutil(或msi安装程序)

将程序集添加到全局缓存中

我想到,当你调用特定版本的程序集时,首先会搜索gac,所以如果它安装在GAC中,则从不使用引用的代码库路径。

当使用ActiveX时,您使用GUID寻址组件。由于regasm添加了GUID所代表的程序集名称和版本,因此Web浏览器直接使用GAC中的组件。

从桌面应用程序使用时,直接引用assebmly并将copylocal属性设置为false。同样,在客户端机器窗口中将找到位于GAC本身的程序集。

以下是有关该主题的有用链接。

http://www.simple-talk.com/dotnet/visual-studio/build-and-deploy-a-.net-com-assembly/

希望它能节省其他人的时间:)。