VSXI引用的程序集未正确加载

问题描述

在给定的VSIX中,我引用了.netstandard版本的nuget软件包Microsoft.TeamFoundationServer.Client,以利用{{1}的ProjectHttpClient类的Projects方法获得GetProjects()的列表。 }。
方法调用时,我在运行时遇到Microsoft.TeamFoundation.Core.WebApi.dll异常。
我花了很长时间才知道,这是因为VSIX已加载到devenv.exe App Domain中,该域已经从以下代码加载了具有不同版本(和Method not found方法的不同签名)的相同引用程序集路径:
GetProjects()

为了使它起作用我已经做了一些事情:

  1. 在VSIX的C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer方法执行期间,使用Assembly.LoadFrom手动将nuegt程序集附加到已加载的程序集列表中。
  2. 尝试使用assemblyIdentity指向运行时使用该nuget版本,事实证明这毫无意义,因为它在VSIX软件包中显然被忽略了。(link)
  3. InitializeAsync替换为程序集packagereference,该程序集指向解决该问题的上述Reference文件夹中的程序集版本,但这使我的VSIX与目标环境二进制文件紧密绑定版本。这听起来不合逻辑。

解决方法

我可以在本地环境上重现此问题。这是详细信息: enter image description here

我们可以在函数“ 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方法: enter image description here

所以我建议您使用5个参数更改GetProjects方法:

 var test = projectClient.GetProjects(null,3,1,null,null).Result;

这是测试结果:

enter image description here