引用较旧版本的nuget依赖项的C#库会导致程序集反射失败

Dan*_*iel 7 .net c# swashbuckle

我的项目中的一个nuget依赖项(Swashbuckle)需要一个版本的System.Web.Http库(4.0.0.0),它比项目其余部分(5.2.3.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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

上面的重要部分是apiDescription参数Apply.

正常构建项目时,上面编译并运行正常.但是,当我反思正在运行的程序集时assembly.GetTypes(),

var asm = System.Reflection.Assembly.GetExecutingAssembly();
var types = asm.GetTypes()
Run Code Online (Sandbox Code Playgroud)

一个ReflectionTypeLoadException被抛出,有以下装载机异常详细信息:

Method 'Apply' in type 'OperationFilter' from assembly 'MyAssembly, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an 
implementation.
Run Code Online (Sandbox Code Playgroud)

这个问题引用了上述例外情况,但没有一个解决方案似乎有效.我尝试通过向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>
Run Code Online (Sandbox Code Playgroud)

但是,这似乎没有做任何事情.

如何才能正确加载此类型?

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

Hel*_*eda 1

跟进我的评论...

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

这是我的 Swashbuckle 分支,我已将所有依赖项升级到最新版本,并使用最新的 Swagger-UI (3.x),这与旧版本相比是一个巨大的变化,让我知道您是否喜欢它。