3

私のディレクトリ構造は次のようになります。

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

HostProgram.exeHostedLib.dllに依存するを読み込もうとしていますSharedLib.dll

したがって、は をロードするために作成していますがSharedLib.dllApplicationBaseを見つけることができる必要があります。AppDomain/Host Program Base/HostedLibs/SharedLib.dll

forに追加しようとし..ましたが、 MSDNによると、PrivateBinPathAppDomain

プライベート アセンブリは、アプリケーションと同じディレクトリ構造に配置されます。PrivateBinPath に指定されたディレクトリが ApplicationBase の下にない場合、それらは無視されます。

は のPrivateBinPath内部ではApplicationBaseなく、1 つ上のディレクトリにあるため、内部になく、ApplicationBase無視されています。したがってAssemblyResolveException、DLL を new にロードしようとすると、エラーが発生しますAppDomain

をフォルダに設定して として追加しようとしましApplicationBaseたがHost Program Base、これによりドメインがまったく解決できなくなります。HostedLibsPrivateBinPathHostedLib.dll

だから - >を使用して外部のライブラリを解決するにはどうすればよいApplicationBaseAppDomainSetupですか?

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

Jim の回答に基づいて実装されたソリューション:

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 に答える