C#库引用了较旧版本的NuGet依赖,导致程序集反射失败。

7

我的项目中一个NuGet依赖项(Swashbuckle)需要比整个项目所需版本(5.2.3.0)更旧的System.Web.Http库(4.0.0.0)。

Swashbuckle要求我编写一个实现特定接口的类:

public class OperationFilter : Swashbuckle.Swagger.IOperationFilter
{
    public void Apply(Swashbuckle.Swagger.Operation operation, Swashbuckle.Swagger.SchemaRegistry schemaRegistry, System.Web.Http.Description.ApiDescription apiDescription)
    {

    }
}

上面重要的部分是ApplyapiDescription参数。
通常情况下,编译和运行上述代码都不会出现问题。但是,当我使用assembly.GetTypes()反射运行程序集时,就会出现问题。
var asm = System.Reflection.Assembly.GetExecutingAssembly();
var types = asm.GetTypes()

当出现ReflectionTypeLoadException异常时,将抛出以下加载程序异常详细信息:

Method 'Apply' in type 'OperationFilter' from assembly 'MyAssembly, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an 
implementation.

这个问题引用了上述异常,但是提出的解决方案似乎都无效。 我尝试通过在Web.config中添加bindingRedirect来解决这个问题:

        <dependentAssembly>
            <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
        </dependentAssembly>

不过,那似乎没有起到任何作用。

我该如何使这种类型正确加载?

编辑:我已经创建了一个最小化的问题复现仓库。在BuildTask.targets中的一个构建任务将加载项目程序集,然后尝试加载所有类型。错误被抛出并显示。


{btsdaf} - Helder Sepulveda
@HelderSepu,我刚刚添加了一个可复现的示例,谢谢! - Daniel
那个项目不是WebApi... - Helder Sepulveda
我在GitHub上向您发送了一个PullRequest: https://github.com/JustASquid/TestSwaggerAssemblyIssue/pull/1 - Helder Sepulveda
我希望我能回答那个问题,但我尝试更新它时,所有者不同意。你可以自己问所有者: https://github.com/domaindrivendev/Swashbuckle/pull/1062 - Helder Sepulveda
显示剩余2条评论
1个回答

1

跟进我的评论...

我刚刚测试了示例项目,这个问题可以使用Swagger-Net解决。

那是我对Swashbuckle的分支,我已经将所有依赖项升级到最新版本,并且还使用了最新的Swagger-UI(3.x),与旧版本相比有很大的改变,让我知道你喜欢它吗。


我不确定是否想要转移到一个没有Swashbuckle那么受支持/使用的库。Swagger-Net不是成为Swashbuckle的PR的原因吗? - Daniel
什么是“不受大力支持”的意思?我个人提供支持,经常修复错误并添加功能,只需看一下NuGet上的发布频率即可。 - Helder Sepulveda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接