3

我的目录结构如下所示:

-- Host Program Base
  |- HostProgram.exe
  |- SharedLIB.dll
  |-- LoadedLibs
     |- HostedLib.dll

HostProgram.exe正在尝试加载HostedLib.dll,这取决于SharedLib.dll.

因此,我SharedLib.dll正在创建以加载它,但它需要能够找到.ApplicationBaseAppDomain/Host Program Base/HostedLibs/SharedLib.dll

我试图添加..PrivateBinPathforAppDomain但根据MSDN

私有程序集部署在与应用程序相同的目录结构中。如果为 PrivateBinPath 指定的目录不在 ApplicationBase 下,它们将被忽略。

由于PrivateBinPath不在 内部ApplicationBase,而是在一个目录中,因此它不在内部ApplicationBase并且被忽略。因此,AssemblyResolveException当我尝试将 DLL 加载到新的AppDomain.

我还尝试将 设置ApplicationBaseHost Program Base文件夹并添加HostedLibsPrivateBinPath,但这会导致域根本无法解析HostedLib.dll

那么->如何ApplicationBase使用AppDomainSetup?

4

2 回答 2

1

如果不重新组织您的应用程序结构,您可以使用AppDomain.AssemblyResolve event.

基本上是这样工作的。

  1. 订阅 AppDomain 上的 AssemblyResolve 事件。
  2. 当事件触发时,您可以专门查找您的 SharedLib.dll 或简单地尝试在根文件夹中创建所需程序集的完整路径,给定在ResolveEventArgs.Name和使用中指定的程序集名称Assembly.LoadFrom(path)
  3. 如果程序集从路径成功加载,则在AssemblyResolve 处理程序中返回它,否则返回null
于 2013-07-08T18:57:58.187 回答
0

根据吉姆的回答实施的解决方案:

internal static class Program
{
    static Program()
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainOnAssemblyResolve;
    }

    private static void Main()
    {
        //Do your stuff
    }

    private static Assembly CurrentDomainOnAssemblyResolve(object sender, ResolveEventArgs args)
    {
        try
        {
            AssemblyName name = new AssemblyName(args.Name);

            string expectedFileName = name.Name + ".dll";
            string rootDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            return LoadAssembly(rootDir, expectedFileName, "", "Dlls", "../Dlls");
        }
        catch
        {
            return null;
        }
    }

    private static Assembly LoadAssembly(string rootDir, string fileName, params string[] directories)
    {
        foreach (string directory in directories)
        {
            string path = Path.Combine(rootDir, directory, fileName);
            if (File.Exists(path))
                return Assembly.LoadFrom(path);
        }
        return null;
    }
}
于 2016-04-12T13:21:27.673 回答