我的项目中一个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)
{
}
}
上面重要的部分是
Apply
的apiDescription
参数。通常情况下,编译和运行上述代码都不会出现问题。但是,当我使用
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
中的一个构建任务将加载项目程序集,然后尝试加载所有类型。错误被抛出并显示。