Loading

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;

}

此时即可达成我们想实现的目的,A.exe在根目录,B.dll在API/B.dll目录,
并存在依赖关系,可强类型声明
posted @ 2024-04-25 10:42  Stay627  阅读(82)  评论(0编辑  收藏  举报