Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在没有app.config的情况下设置探测私有路径?_C#_Path_App Config_Private_Probing - Fatal编程技术网

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

C#在没有app.config的情况下设置探测私有路径?,c#,path,app-config,private,probing,C#,Path,App Config,Private,Probing,我有一个C#应用程序,为了组织它的文件,我在一个名为“数据”的文件夹中有一些DLL。我希望EXE检查此文件夹中的DLL,就像检查当前目录一样。如果我使用以下信息创建了App.Config: <?xml version="1.0" encoding="utf-8" ?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

我有一个C#应用程序,为了组织它的文件,我在一个名为“数据”的文件夹中有一些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的情况下设置探测路径?

您可以为您创建的新AppDomain设置探测路径,我认为在当前/默认AppDomain的托管代码中没有这种方法


编辑:使用私有路径创建AppDomain:use and.PrivateBinPath

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

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
以及:


+1.不可能-必须在创建AppDomain时设置。app.config由程序从运行时开始计算。唯一的选择是在代码中创建第二个appdomain。这可能是一个温和的方法。用链接更新了答案。这不起作用,你能告诉我把它放在我的代码中的什么地方吗?也许是一个代码示例?不清楚你在“那”中尝试了什么。从“当我在新创建的AppDomain中运行代码时,我的PrivateBinPath不受尊重。这是我的代码…这是我希望在新AppDomain中运行的代码…”开始问另一个问题。如果你的应用文件夹和子文件夹中有一个dll文件,并且希望优先使用子文件夹中的一个(因为说它是不同的版本),那么这就是我们要走的路。如果有,app.config方法将始终首先使用app文件夹中的dll,如果本地文件夹中没有dll,则只查看提供的路径。
 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;
    }