c# - C#如何在不注册的情况下使用旧版DLL(regsvr32)

标签 c# visual-studio com build registration

情况
我运行一个构建系统,它为许多项目执行许多构建。为避免一个构建影响另一个构建,我们将构建用户锁定在其工作区内。构建以非特权用户的身份运行,他们只能对工作区进行写入。

挑战
在我们的新构建过程中,我们需要使用遗留的 3rdparty DLL,它通过 COM 公开其接口(interface)。开发团队想要注册构建 (regsrv32.exe),但我们的构建安全机制阻止了此事件。如果我们放松制度,那么 3rdparty DLL 将影响其他构建,如果我有两个构建需要两个不同的版本,我可能会针对错误的版本编译错误的构建(这种可能性非常大)。

问题
除了注册之外,是否还有其他选项可以处理通过 COM 公开其接口(interface)的遗留 DLL?

感谢帮助

彼得

最佳答案

有关我对类似问题的原始回答,请参阅:TFS Build server and COM references - does this work?

编译引用 COM 组件但 COM 组件未在构建服务器上注册的 .NET 代码的一个好方法是在项目/构建文件中使用 COMFileReference 引用项而不是 COM引用COMFileReference 项如下所示:

<ItemGroup>
  <COMFileReference Include="MyComLibrary.dll">
    <EmbedInteropTypes>True</EmbedInteropTypes>
  </COMFileReference>
</ItemGroup>

由于 Visual Studio 不为 COMFileReference 提供设计器支持,因此您必须手动编辑项目/构建文件。

在生成期间,MSBuild 从 COM DLL 中提取类型库信息并创建互操作程序集,该程序集可以是独立的,也可以嵌入到调用 .NET 程序集中。

每个 COMFileReference 项目也可以有一个 WrapperTool 属性,但默认设置似乎对我来说很好。 EmbedInteropTypes 属性未记录为适用于 COMFileReference,但它似乎按预期工作。

参见 https://learn.microsoft.com/en-ca/visualstudio/msbuild/common-msbuild-project-items#comfilereference了解更多细节。此 MSBuild 项目从 .NET 3.5 开始可用。

遗憾的是似乎没有人对这项技术一无所知,对我来说这似乎比其他方法更简单。这实际上并不奇怪,因为我只能在网上找到上面提到的那个。我自己通过深入研究 MSBuild 的 Microsoft.Common.targets 文件发现了这项技术。

关于c# - C#如何在不注册的情况下使用旧版DLL(regsvr32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842742/

相关文章:

c# - 如何在 ListView 中将 TextAlign 更改为居中?

c# - 如何加快这个计算

visual-studio - 为什么我不能在 Visual Studio 中禁用预编译头文件?

java - 结构复杂的JNA

internet-explorer - 重用 Internet Explorer COM 自动化对象

c# - 使用名称单独超链接创建 Gridview

c# - 在屏幕上放置半透明标记 (Windows XP)

visual-studio - 为什么代码段管理器不起作用?

c# - 如何在 Visual Studio 2015 中禁用实时编译

c# - 初始化 VCProjectEngineObject (Microsoft.VisualStudio.VCProjectEngine.dll) 时出现错误 80040154(类未注册异常)