C# 从不同于exe目录的文件夹引用.net dll

C# 从不同于exe目录的文件夹引用.net dll,c#,C#,我有一个结构:- \bin\debug\abc.exe和 \Libs\win32\xyz.dll。 现在我需要引用xyz.dll,以便运行我的abc.exe。我尝试在app.config中使用“探测”标记,但在这种情况下,只有当我在“debug”文件夹中有Libs”文件夹,即存在.exe时,才可能出现这种情况。但我想从.exe中取出两个文件夹,然后进入\Libs\win32以引用.dll。请建议我该怎么做。您可以使用文件路径中的..\向上移动目录。 因此,如果您在\bin\debug\abc.e

我有一个结构:-
\bin\debug\abc.exe
\Libs\win32\xyz.dll

现在我需要引用
xyz.dll
,以便运行我的
abc.exe
。我尝试在
app.config
中使用“探测”标记,但在这种情况下,只有当我在“
debug
”文件夹中有
Libs
”文件夹,即存在
.exe
时,才可能出现这种情况。但我想从.exe中取出两个文件夹,然后进入
\Libs\win32
以引用.dll。请建议我该怎么做。

您可以使用文件路径中的..\向上移动目录。
因此,如果您在\bin\debug\abc.exe中,那么您对\Libs\win32\xyz.dll的引用将是

..\..\Libs\win32\xyz.dll
只有在构建项目时才需要这样做,在构建项目时,如果可执行文件正确引用了dll,则只需将其与dll放在同一文件夹中即可


当然,除非您使用的是dllimport或运行时需要知道dll确切路径的东西。

一个选项是处理
AssemblyResolve
事件,每次.NET在当前路径中找不到所需的程序集时,它都会触发
AssemblyResolve
事件:

{
    // Execute in startup
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainOnAssemblyResolve;
}

private Assembly CurrentDomainOnAssemblyResolve(object sender, ResolveEventArgs args)
{
    string RESOURCES = ".resources";
    try
    {
        /* Extract assembly name */
        string[] sections =  args.Name.Split(new char[] { ',' });
        if (sections.Length == 0) return null;

        string assemblyName = sections[0];

        /* If assembly name contains ".resource", you don't need to load it*/
        if (assemblyName.Length >= RESOURCES.Length &&
                assemblyName.LastIndexOf(RESOURCES) == assemblyName.Length - RESOURCES.Length)
        {
            return null;
        }

        /* Load assembly to current domain (also you can use simple way to load) */
        string assemblyFullPath = "..//..//Libs//" + assemblyName;
        FileStream io = new FileStream(assemblyNameWithExtension, FileMode.Open, FileAccess.Read);
        if (io == null) return null;
        BinaryReader binaryReader = new BinaryReader(io);
        Assembly assembly = Assembly.Load(binaryReader.ReadBytes((int)io.Length));

        return assembly;
   }
   catch(Exception ex)
   {}
}

*另一种选择是在项目启动时将所有必需的程序集加载到当前域。

使用反射加载程序集故意调用此类DLL地狱是非常不明智的,CLR会尽力帮助您避免走火入魔。要解决此问题,需要AppDomain.AssemblyResolve事件,请在该事件的事件处理程序中使用Assembly.LoadFrom()。确保Main()方法中还不需要该路径。但我应该在哪里使用该路径。app.confog中的标记不适用于此类路径,因为它只能引用子文件夹。不,但只有在运行EXE时,我才需要引用不同文件夹中的dll。您到底是如何使用此dll的,它是正常的.NET项目引用还是Win32 dll或其他?在生成过程中,是否有原因不将其与.exe复制到同一文件夹或子文件夹中?这是一个普通的.Net dll。原因是我们也在用java做同样的项目。所以,当我们给客户端时,我们希望.net的exe和java的jar在一个文件夹中,所有依赖的DLL在另一个文件夹中。请提出一些建议。上面的代码对我不起作用