【问题标题】:How to create a generic use library如何创建通用使用库
【发布时间】:2010-12-27 22:11:04
【问题描述】:

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

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

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

我使用 regasm 注册 com。但我不知道如何从 Visual Studio 中引用它(比如用 clsid 引用?)

当我选择添加引用并选择 COM 选项卡时,可能会在视觉工作室中,我应该在列表中看到我的组件。

注意:我尝试使用这些行将程序集添加到全局缓存中,但没有成功 - 或者我无法理解是否有任何变化:)

"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

任何建议表示赞赏, 问候

【问题讨论】:

    标签: c# .net winforms com activex


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,它节省了我找出解决方案的时间。
    【解决方案2】:

    我想出了一个解决办法。

    一步一步解释:

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

    在客户端机器上

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

    3- 使用 gacutil(或 msi 安装程序)将程序集添加到全局缓存

    我发现当您调用程序集的特定版本时,首先会搜索 gac,因此如果将其安装在 GAC 中,则永远不会使用引用的代码库路径。

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

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

    这是一个关于该主题的有用链接。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-18
      • 2017-04-10
      • 2014-06-02
      • 1970-01-01
      • 2019-05-17
      • 2012-06-28
      • 1970-01-01
      相关资源
      最近更新 更多