相同dll的引用问题
1、最近项目中出现了DXF分割的不同引用,一个普通的分割,一个异形分割,但是都是不同版本的dll,却有着同一个命名空间,我在引用时候使用的地址不一样,但是输出地址都是一样的,导致其中一个分割解析出错。
2、解决方案
2-1、使用
<Aliases></Aliases>
为两个dll起个别名,并且重命名输出目录
<!-- 在类库项目 ClassLib.csproj 中 -->
<ItemGroup>
<Reference Include="MyNamespace.V1">
<HintPath>..\Libs\Version1\MyNamespace.dll</HintPath>
<Aliases>V1</Aliases>
<!-- 关键修改:重命名输出文件 -->
<Link>%(FileName).V1%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Reference>
</ItemGroup>
<!-- 在主程序项目 App.csproj 中 -->
<ItemGroup>
<Reference Include="MyNamespace.V2">
<HintPath>..\Libs\Version2\MyNamespace.dll</HintPath>
<Aliases>V2</Aliases>
<!-- 重命名输出文件 -->
<Link>%(FileName).V2%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Reference>
</ItemGroup>
2-2、
隔离到子目录
<!-- 在所有项目中统一配置 -->
<ItemGroup>
<Reference Include="MyNamespace">
<HintPath>..\Libs\Version1\MyNamespace.dll</HintPath>
<Aliases>V1</Aliases>
<!-- 复制到子目录 -->
<Private>True</Private>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<DestinationSubDirectory>Version1\</DestinationSubDirectory>
</Reference>
</ItemGroup>
2-3、在运行时动态绑定
// 在程序启动时注册解析器
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var assemblyName = new AssemblyName(args.Name);
// 根据命名空间决定加载路径
if (assemblyName.Name == "MyNamespace")
{
string path = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory,
"Version1", // 或 Version2
"MyNamespace.dll"
);
return Assembly.LoadFrom(path);
}
return null;
};
2-4、
在App.config精确版本
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MyNamespace" publicKeyToken="..." />
<!-- 强制加载 Version1 -->
<codeBase version="1.0.0.0" href="Version1/MyNamespace.dll"/>
<!-- Version2 的绑定 -->
<codeBase version="2.0.0.0" href="Version2/MyNamespace.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

浙公网安备 33010602011771号