tl;博士
程序集和 DLL 文件的概念并不相同。根据程序集的加载方式,路径信息会丢失或根本不可用。不过,在大多数情况下,提供的答案都会起作用。
这个问题和之前的答案有一个误解。在大多数情况下,提供的答案可以正常工作,但在某些情况下,无法获得当前代码所在程序集的正确路径。
程序集(包含可执行代码)和 dll 文件(包含程序集)的概念不是紧密耦合的。程序集可能来自 DLL 文件,但并非必须如此。
使用Assembly.Load(Byte[])
( MSDN ) 方法,您可以直接从内存中的字节数组加载程序集。字节数组来自哪里并不重要。它可以从文件加载,从互联网下载,动态生成,...
这是一个从字节数组加载程序集的示例。加载文件后路径信息会丢失。无法获取原始文件路径,并且所有先前描述的方法都不起作用。
此方法位于执行程序集中,该程序集位于“D:/Software/DynamicAssemblyLoad/DynamicAssemblyLoad/bin/Debug/Runner.exe”
static void Main(string[] args)
{
var fileContent = File.ReadAllBytes(@"C:\Library.dll");
var assembly = Assembly.Load(fileContent);
// Call the method of the library using reflection
assembly
?.GetType("Library.LibraryClass")
?.GetMethod("PrintPath", BindingFlags.Public | BindingFlags.Static)
?.Invoke(null, null);
Console.WriteLine("Hello from Application:");
Console.WriteLine($"GetViaAssemblyCodeBase: {GetViaAssemblyCodeBase(assembly)}");
Console.WriteLine($"GetViaAssemblyLocation: {assembly.Location}");
Console.WriteLine($"GetViaAppDomain : {AppDomain.CurrentDomain.BaseDirectory}");
Console.ReadLine();
}
该类位于 Library.dll 中:
public class LibraryClass
{
public static void PrintPath()
{
var assembly = Assembly.GetAssembly(typeof(LibraryClass));
Console.WriteLine("Hello from Library:");
Console.WriteLine($"GetViaAssemblyCodeBase: {GetViaAssemblyCodeBase(assembly)}");
Console.WriteLine($"GetViaAssemblyLocation: {assembly.Location}");
Console.WriteLine($"GetViaAppDomain : {AppDomain.CurrentDomain.BaseDirectory}");
}
}
为了完整起见,GetViaAssemblyCodeBase()
这两个程序集的实现是相同的:
private static string GetViaAssemblyCodeBase(Assembly assembly)
{
var codeBase = assembly.CodeBase;
var uri = new UriBuilder(codeBase);
return Uri.UnescapeDataString(uri.Path);
}
Runner 打印以下输出:
Hello from Library:
GetViaAssemblyCodeBase: D:/Software/DynamicAssemblyLoad/DynamicAssemblyLoad/bin/Debug/Runner.exe
GetViaAssemblyLocation:
GetViaAppDomain : D:\Software\DynamicAssemblyLoad\DynamicAssemblyLoad\bin\Debug\
Hello from Application:
GetViaAssemblyCodeBase: D:/Software/DynamicAssemblyLoad/DynamicAssemblyLoad/bin/Debug/Runner.exe
GetViaAssemblyLocation:
GetViaAppDomain : D:\Software\DynamicAssemblyLoad\DynamicAssemblyLoad\bin\Debug\
如您所见,代码库、位置或基本目录都不正确。