问题描述
在给定的VSIX中,我引用了.netstandard版本的nuget软件包Microsoft.TeamFoundationServer.Client,以利用{{1}的ProjectHttpClient
类的Projects方法获得GetProjects()
的列表。 }。
在方法调用时,我在运行时遇到Microsoft.TeamFoundation.Core.WebApi.dll
异常。
我花了很长时间才知道,这是因为VSIX已加载到devenv.exe App Domain中,该域已经从以下代码加载了具有不同版本(和Method not found
方法的不同签名)的相同引用程序集路径:GetProjects()
。
为了使它起作用我已经做了一些事情:
- 在VSIX的
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer
方法执行期间,使用Assembly.LoadFrom
手动将nuegt程序集附加到已加载的程序集列表中。 - 尝试使用
assemblyIdentity
指向运行时使用该nuget版本,事实证明这毫无意义,因为它在VSIX软件包中显然被忽略了。(link)。 - 将
InitializeAsync
替换为程序集packagereference
,该程序集指向解决该问题的上述Reference
文件夹中的程序集版本,但这使我的VSIX与目标环境二进制文件紧密绑定版本。这听起来不合逻辑。
解决方法
我们可以在函数“ GetProjects”中找到6个参数。最后一个参数的类型为布尔值。我也可以在类“ ProjectHttpClient”上找到相关方法
public virtual Task<IPagedList<TeamProjectReference>> GetProjects(ProjectState? stateFilter,int? top,int? skip,object userState,string continuationToken)
{
return GetProjects(stateFilter,top,skip,userState,continuationToken,null);
}
public virtual Task<IPagedList<TeamProjectReference>> GetProjects(ProjectState? stateFilter = null,int? top = null,int? skip = null,object userState = null,string continuationToken = null,**bool? getDefaultTeamImageUrl = null**)
{
List<KeyValuePair<string,string>> queryParams = new List<KeyValuePair<string,string>>();
QueryParamHelper.AddNonNullParam(queryParams,"stateFilter",stateFilter);
QueryParamHelper.AddNonNullParam(queryParams,"$top",top);
QueryParamHelper.AddNonNullParam(queryParams,"$skip",skip);
QueryParamHelper.AddNonNullParam(queryParams,"continuationToken",continuationToken);
QueryParamHelper.AddNonNullParam(queryParams,"getDefaultTeamImageUrl",getDefaultTeamImageUrl);
return GetProjectsAsync(queryParams,userState);
}
但是,我们在官方站点中找不到带有6个参数的GetProjects方法:
所以我建议您使用5个参数更改GetProjects方法:
var test = projectClient.GetProjects(null,3,1,null,null).Result;
这是测试结果: