繁体   English   中英

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

[英]VSXI referenced assemblies not loaded properly

在我给VSIX我已引用NuGet包的.netstandard的版本Microsoft.TeamFoundationServer.Client得到的列表项目利用GetProjects()的方法ProjectHttpClient从类Microsoft.TeamFoundation.Core.WebApi.dll assemly。
在方法调用时,我在运行时Method not found异常。
我花了很长时间才知道,这是因为 VSIX 已加载到 devenv.exe 应用程序域中,该应用程序域已经从以下路径加载了具有不同版本(以及不同的GetProjects()方法签名GetProjects()的相同引用程序集:
C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer

我为使其工作所做的一些事情:

  1. 在 VSIX 的InitializeAsync方法期间使用Assembly.LoadFrom手动将 nuegt 程序集附加到加载的程序集列表中,但没有帮助。
  2. 尝试使用assemblyIdentity指向运行时使用该 nuget 版本,结果证明这是毫无意义的,因为它显然在 VSIX 包中被忽略了。 (链接)
  3. PackageReference替换为指向该版本程序集的程序集Reference ,位于上述解决问题的Team Explorer文件夹中,但它使我的 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;

这是测试结果:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM