相同的类型在两个程序集

时间:2016-01-30 03:01:55

标签: c# .net vsto code-analysis customtaskpane

我有一个VSTO-addin,它使用CustomTaskPanes。我的代码编译和工作正常,但问题来自代码分析器,如Resharper和.net的代码合同。

此代码会引发两个分析器的错误消息:

CustomTaskPane taskPane = CustomTaskPanes.Add(new UserControl(), "Title");
taskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
  

无法转换源类型' Microsoft.Office.Core.MsoCTPDockPosition [office,Version = 15.0.0.0,Culture = neutral,PublicKeyToken = 71e9bce111e9429c]'目标类型' Microsoft.Office.Core.MsoCTPDockPosition [Microsoft.Office.Tools.Common,Version = 10.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a]&​​#39;

这很奇怪,因为公共类型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版本: enter image description here

2 个答案:

答案 0 :(得分:2)

您应该使用VS中的COM选项卡而不是Office.dll

中的Microsoft Office 15.0对象库

答案 1 :(得分:0)

所以,我尝试了几种不同的方法并找到了解决方案。我发现如果我将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工作正常。但Code Contracts仍然给我同样的错误。所以我用dynamic

欺骗了它
((dynamic) taskPane).DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;

我对使用dynamic感到高兴。但代码合同对我来说非常重要,所以我可以容忍一点点肮脏。

如果有人可以解释,为什么Resharper在我更改版本或找到更好,更清晰的代码合同解决方案后开始运作良好 - 我将重新接受答案。

编辑:

((dynamic) taskPane).DockPosition显示了TargetExceptions,并说该对象中不存在该属性。所以我改为使用反射

typeof(CustomTaskPane)
    .InvokeMember("DockPosition", BindingFlags.SetProperty, null, taskPane, new object[] { MsoCTPDockPosition.msoCTPDockPositionFloating }, null);