在两个程序集中定义了相同的类型
The same type is defined in two assemblies
我有一个 VSTO 插件,它使用 CustomTaskPanes。我的代码编译并运行良好,但问题来自代码分析器,例如 .net 的 Resharper 和 Code contracts。
此代码会引发来自两个分析器的错误消息:
CustomTaskPane taskPane = CustomTaskPanes.Add(new UserControl(), "Title");
taskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
Cannot convert source type 'Microsoft.Office.Core.MsoCTPDockPosition [office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]' to target type 'Microsoft.Office.Core.MsoCTPDockPosition [Microsoft.Office.Tools.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]'
这很奇怪,因为 public 类型 Microsoft.Office.Core.MsoCTPDockPosition 只存在于 office.dll 中。无论如何,我尝试使用别名来解决它并将 Microsoft.Office.Tools.Common 命名为 Tools_Common:
extern alias Tools_Common;
using System;
using System.Windows.Forms;
using Microsoft.Office.Core;
using Tools_Common::Microsoft.Office.Tools;
using CustomTaskPane = Tools_Common::Microsoft.Office.Tools.CustomTaskPane;
但是一点用都没有。消息的原因是什么?我该如何解决(尤其是代码合约)?
此外,我发现了另一个奇怪的工件 - Resharper 的自动完成显示 MsoCTPDockPosition 就像它存在于 Microsoft.Office.Tools.Common.dll 中一样,但后来我尝试进行自动完成,它使用 office.dll 版本:
因此,我尝试了几种不同的方法并找到了解决方案。我发现如果我将 Office.dll 程序集从
更改为另一个版本
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office15\Office.dll, 15.0.4420.1017
到
C:\Windows\assembly\GAC_MSIL\office, 15.0.4787.1001
然后 Resharper 工作正常。但是代码合同仍然给我同样的错误。所以我用 dynamic
字
愚弄了它
((dynamic) taskPane).DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
我对使用 dynamic
不是很满意。但是 Code Contracts 对我来说非常重要,所以我可以容忍它有点脏。
如果有人能解释,为什么 Resharper 在我更改版本或找到更好、更清洁的代码契约解决方案后开始运行良好 - 我会重新接受答案。
编辑:
((dynamic) taskPane).DockPosition
显示 TargetExceptions 并表示对象中不存在 属性。所以我将其更改为使用反射
typeof(CustomTaskPane)
.InvokeMember("DockPosition", BindingFlags.SetProperty, null, taskPane, new object[] { MsoCTPDockPosition.msoCTPDockPositionFloating }, null);
您应该使用 VS 中 COM 选项卡中的 Microsoft Office 15.0 对象库,而不是 office.dll
我有一个 VSTO 插件,它使用 CustomTaskPanes。我的代码编译并运行良好,但问题来自代码分析器,例如 .net 的 Resharper 和 Code contracts。
此代码会引发来自两个分析器的错误消息:
CustomTaskPane taskPane = CustomTaskPanes.Add(new UserControl(), "Title");
taskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
Cannot convert source type 'Microsoft.Office.Core.MsoCTPDockPosition [office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]' to target type 'Microsoft.Office.Core.MsoCTPDockPosition [Microsoft.Office.Tools.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]'
这很奇怪,因为 public 类型 Microsoft.Office.Core.MsoCTPDockPosition 只存在于 office.dll 中。无论如何,我尝试使用别名来解决它并将 Microsoft.Office.Tools.Common 命名为 Tools_Common:
extern alias Tools_Common;
using System;
using System.Windows.Forms;
using Microsoft.Office.Core;
using Tools_Common::Microsoft.Office.Tools;
using CustomTaskPane = Tools_Common::Microsoft.Office.Tools.CustomTaskPane;
但是一点用都没有。消息的原因是什么?我该如何解决(尤其是代码合约)?
此外,我发现了另一个奇怪的工件 - Resharper 的自动完成显示 MsoCTPDockPosition 就像它存在于 Microsoft.Office.Tools.Common.dll 中一样,但后来我尝试进行自动完成,它使用 office.dll 版本:
因此,我尝试了几种不同的方法并找到了解决方案。我发现如果我将 Office.dll 程序集从
更改为另一个版本C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office15\Office.dll, 15.0.4420.1017
到
C:\Windows\assembly\GAC_MSIL\office, 15.0.4787.1001
然后 Resharper 工作正常。但是代码合同仍然给我同样的错误。所以我用 dynamic
字
((dynamic) taskPane).DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
我对使用 dynamic
不是很满意。但是 Code Contracts 对我来说非常重要,所以我可以容忍它有点脏。
如果有人能解释,为什么 Resharper 在我更改版本或找到更好、更清洁的代码契约解决方案后开始运行良好 - 我会重新接受答案。
编辑:
((dynamic) taskPane).DockPosition
显示 TargetExceptions 并表示对象中不存在 属性。所以我将其更改为使用反射
typeof(CustomTaskPane)
.InvokeMember("DockPosition", BindingFlags.SetProperty, null, taskPane, new object[] { MsoCTPDockPosition.msoCTPDockPositionFloating }, null);
您应该使用 VS 中 COM 选项卡中的 Microsoft Office 15.0 对象库,而不是 office.dll