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在另一个文件夹中。请提出一些建议。上面的代码对我不起作用