1

我有一个适用于 vs2008 和 vs2010 的加载项。它连接到 TFS 2010 并使用其本地路径获取有关文件的信息(SourceControlBindings 类)

代码非常简单:

var sc = app.DTE.SourceControl as SourceControl2;

然后

static SourceControlBindings GetBinding(SourceControl2 sc, string fileName)
{
    return sc.GetBindings(fileName);
}

在 vs 2008 和 vs 2010 中,它可以正常工作。但是当我尝试在 vs2012 中使用相同的代码时,我得到了错误

图书馆未注册。(来自 HRESULT 的异常:0x8002801D (TYPE_E_LIBNOTREGISTERED))

访问使用 GetBinding 返回的对象的任何属性时

var bindings = GetBinding(sc, filePath);
Log.Debug("server:{0} bindings:{1}", bindings.ServerName, bindings.ServerBinding);

我还在解决方案资源管理器中使用黄色三角形标记了 EnvDTE 引用,并且这些程序集中的类型无法使用Goto 定义VS 命令解析。但是,当我使用插件向导创建插件项目时。并且项目编译完毕,可以启动了(又启动了一个VS2012实例,在插件源码中打断点)

如何在 vs2012 中获取 SourceControlBindings?为什么 EnvDTE 引用在我的插件项目中标记为黄色?

谢谢

PS 最奇怪的是调试器同时显示 ServerName 和 ServerBinding 属性值。但是异常堆栈显示与日志记录完全一致

错误 COMException 库未注册。(来自 HRESULT 的异常:0x8002801D (TYPE_E_LIBNOTREGISTERED))

堆栈在 System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)

在 System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 错误代码)

在 System.Dynamic.ComRuntimeHelpers.CheckIfMissingTypeInfoIsExpected(Int32 hresult,布尔 throwIfMissingExpectedTypeInfo)

在 System.Dynamic.ComRuntimeHelpers.GetITypeInfoFromIDispatch(IDispatch 调度,布尔 throwIfMissingExpectedTypeInfo)

在 System.Dynamic.IDispatchComObject.EnsureScanDefinedMethods()

在 System.Dynamic.IDispatchComObject.System.Dynamic.IDynamicMetaObjectProvider.GetMetaObject(表达式参数)

在 System.Dynamic.DynamicMetaObject.Create(对象值,表达式表达式)

在 System.Dynamic.DynamicMetaObjectBinder.Bind(Object[] args,ReadOnlyCollection`1 参数,LabelTarget returnLabel)

在 System.Runtime.CompilerServices.CallSiteBinder.BindCore[T](CallSite`1 站点,Object[] args)

在 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite 站点,T0 arg0)

在 CallSite.Target(闭包,CallSite,对象)

在 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite 站点,T0 arg0)

与此处的日志记录一致

PPS 似乎与 .net 4.5 动态功能有关(不知道为什么涉及它)。恢复到 .net 3.5(作为临时解决方案)

4

1 回答 1

0

为了使其适用于.net 4,我将 GetBindings 调用替换为

Workspace.GetServerItemForLocalItem(FullName)

来自 Microsoft.TeamFoundation.VersionControl.Client.Workspace 类(参见http://www.codewrecks.com/blog/index.php/2010/09/13/how-to-get-tfs-server-address-from-a -local-folder-mapped-to-a-workspace/了解详情)

于 2013-07-02T11:14:24.523 回答