>假设我有两个版本的程序集,具有完全相同的公共接口,但实现略有不同。我在开发过程中引用了一个版本进行编译。在我的程序启动期间,我想以某种方式选择要针对这两个程序集中的哪一个运行。
有没有办法不使用反射并且与所有.NET Standard 2.1实现兼容?
程序集在首次使用之前不会加载 - 因此,只要您将所需的版本复制到使用该程序集中的任何类型之前加载它的位置,它就会被加载。
事实上,使用反射(Assembly.Load
/LoadFrom
(是更常见的解决方案,但它具有完全相同的限制 - 您必须在使用任何类型之前执行此操作,否则默认加载逻辑将选择任何可用(或干脆失败(。
我会尝试在csproj中使用条件。
<ItemGroup Condition="'$(CONFIG)'=='DEBUG'>
<ProjectReference Include="{PATH_TO_DEV_PROJECT}">
...
</ProjectReference>
</ItemGroup>
<ItemGroup Condition="'$(CONFIG)'!='DEBUG'>
<Reference Include="{PATH_TO_RELEASE_REFERENCE}" />
</ItemGroup>
这可能有助于复制正确的程序集。您也可以使用<PackageReference>...</PackageReference>
。