c# - 如何在一个项目中使用两个不同的 Microsoft Interop 程序集?

标签 c# .net assemblies conflict

我想根据客户计算机上安装的 Office 版本使用两个不同的 Microsoft.Office.Interop 程序集(版本 11 和 12)。

我已经能够将这两个组件添加到我的项目中(我在本地使用它们 - 它们在我的 bin 文件夹中,在两个不同的子文件夹中),我在这个组件上使用了别名以便能够同时使用它们在我的项目中(别名分别是Excel11和Excel12)。

但不幸的是,当我尝试构建解决方案时,我收到了警告:

No way to resolve conflict between "Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" and "Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c". Choosing "Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" arbitrarily.

最佳答案

是的,这很恶心,但可以理解。我强烈建议查看用于无 COM 生成的 Open XML SDK。但我理解时间紧迫和其他要求,所以如果你不能...这就是我会做的。

为了确保在同一页面上,这是我正在考虑的别名 http://www.dotnetperls.com/extern如果由于某些奇怪的原因对您不起作用,您可以使用下面的另一种方法。

为了清洁,您可以创建几个新项目。一个用于您需要实现的每个版本,将它们命名为特定于版本的名称,例如 Excel11、Excel12。

然后为您希望能够从每个函数访问的函数构建包装类,您可以花哨的方式在您的包装类扩展的单独公共(public)项目中构建一个抽象类,这样您就可以从您的 main 中引用它们代码由抽象类名统一。您只需要在主项目中添加对新项目的引用,并根据检查版本、注册表项或其他方式选择所需的包装器。希望对您有所帮助。

关于c# - 如何在一个项目中使用两个不同的 Microsoft Interop 程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1372068/

相关文章:

.net - Authenticode 签名验证 - 是一个缓慢的过程。我应该吗?

C# - 将 .NET 程序集加载到单独的 AppDomain 中以便卸载它

c# - 目录搜索器可以查询操作属性吗?

c# - 使用 GET 访问 WCF 休息服务时出现 400 http 错误请求错误

c# - 在 Windows 服务器上启动 ImageMagick 进程失败,出现 "the specified module could not be found."

c# - 没有可用的来源

c# - 将 foreach 循环更改为 Parallel.ForEach 和奇怪的错误

c# - Linq 2 SQL - 使用比 'Id' 的 ID 名称

.net - Entity Framework 登录失败错误

.net - XMLSerializers Dll 加载失败,出现 Assembly.Load(byte[] asm)