如何在没有app.config文件的情况下设置C#探测私有路径?

13
我有一个C#应用程序,为了组织它的文件,我在一个名为“Data”的文件夹中有一些DLL。 我希望EXE像检查当前目录一样检查这个文件夹中的DLL。如果我创建了一个包含此信息的App.Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Data" />
    </assemblyBinding>
  </runtime>
</configuration>

它可以正常工作,但我不想使用App.Config文件。有没有一种方法可以在不使用app.config的情况下设置探测路径?

2个回答

7
您还可以像这样处理AppDomain的AssemblyResolve事件:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

并且:

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    var probingPath = pathToYourDataFolderHere;
    var assyName = new AssemblyName(args.Name);

    var newPath = Path.Combine(probingPath, assyName.Name);
    if (!newPath.EndsWith(".dll"))
    {
        newPath = newPath + ".dll";
    }
    if (File.Exists(newPath))
    {
        var assy = Assembly.LoadFile(newPath);
        return assy;
    }
    return null;
}

如果您的应用程序文件夹和子文件夹中都有一个dll文件,并且希望优先使用子文件夹中的dll文件(因为它可能是不同版本),那么这就是解决方法。如果本地文件夹中没有dll文件,app.config方法将始终首先使用应用程序文件夹中的dll文件,并仅查找提供的路径。 - dylanT

5
你可以在创建新的AppDomain时这样做,我不认为有一种方法可以在当前/默认的AppDomain中使用托管代码来实现这一点。
编辑:创建带有私有路径的AppDomain:使用AppDomain.CreateDomainAppDomainSetup.PrivateBinPath。

+1。没有办法 - 那必须在创建AppDomain时设置。app.config由运行时从程序启动时评估。唯一的替代方案是在代码中创建第二个appdomain。尽管如此,这可能是一种可行的方法。 - TomTom
已更新答案并添加了链接。 - Alexei Levenkov
1
那个不起作用,你能告诉我在我的代码中放置它的位置,或者给我一个代码示例吗? - Landin Martens
不清楚你在“那个”中尝试了什么。请提出另一个问题,以“当我在新创建的AppDomain中运行代码时,我的PrivateBinPath没有被尊重。这是我的代码...这是我期望在新的AppDomain中运行的内容...”开头。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接