C# 引用程序集编译在非同级目录实现
情景:A项目是主项目,B项目是被引用程序集,
众所周知C#项目和被引用程序集编译时会生成在同一目录
如果想让A.exe和B.dll生成不在统一目录,但是又存在依赖关系应该怎么做呢?
实现原理分为两步
1、配置生成逻辑 2、动态加载DLL
1、配置生成逻辑:
打开A.csproj文件,找到
<ProjectReference Include="..\B\B.csproj">
此处省略
</ProjectReference>
将该标签内的配置改为
<ProjectReference Include="..\B\B.csproj">
<Private>false</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
此时A可以引用B程序集,并可以使用强类型声明
2、动态加载DLL:
注:需要先将B程序集生成目录改至API文件夹下
public App()
{
//订阅DLL加载失败事件,强类型声明未引用则在运行时会报错找不到DLL
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
//获取当前A程序路径
string currentDirectory = Directory.GetCurrentDirectory();
//获取API文件夹下的B.dll路径
string dllPath = Path.Combine(currentDirectory, "API\\B.dll");
//动态加载DLL
Assembly assembly = Assembly.LoadFrom(dllPath);
return (assembly);
//多个DLL加载方式
//foreach (var dllPath in dllList)
//{
// if (File.Exists(dllPath))
// {
// try
// {
// return Assembly.LoadFrom(dllPath);
// }
// catch (Exception ex)
// {
// }
// }
//}
//return null;
}