如何递归加载所有引用的程序集?
如何递归加载所有引用的程序集?
有没有一种方法可以获取包含当前代码的程序集的路径?我不想要调用程序集的路径,只想要包含代码的路径。
基本上,我的单元测试需要读取一些相对于dll文件的xml测试文件。我希望无论是从TestDriven.NET、MbUnit GUI还是其他什么地方运行测试dll,路径都能始终正确解析。
编辑:人们似乎误解了我的问题。
我的测试库位于某个位置。
C:\\projects\\myapplication\\daotests\\bin\\Debug\\daotests.dll
我想要获取这个路径:
C:\\projects\\myapplication\\daotests\\bin\\Debug\\
到目前为止,三个建议在我从MbUnit Gui运行时都失败了:
environment.currentdirectory给出 C:\\Program Files\\MbUnit
system.reflection.assembly.getassembly(typeof(daotests)).location给出C:\\Documents and Settings\\george\\Local Settings\\Temp\\....\\DaoTests.dll
system.reflection.assembly.getexecutingassembly().location与前一个相同。
注意:在.NET Core/.NET 5+中,Assembly.CodeBase
被弃用:https://learn.microsoft.com/en-us/dotnet/api/system.reflection.assembly.codebase?view=net-5.0
原始答案:
我定义了以下属性,因为我们在单元测试中经常使用它。
public static string AssemblyDirectory { get { string codeBase = Assembly.GetExecutingAssembly().CodeBase; UriBuilder uri = new UriBuilder(codeBase); string path = Uri.UnescapeDataString(uri.Path); return Path.GetDirectoryName(path); } }
当使用NUnit(其中程序集从临时文件夹运行)时,Assembly.Location
属性有时会返回一些有趣的结果,因此我更喜欢使用CodeBase
,它以URI格式返回路径,然后UriBuild.UnescapeDataString
删除开头的File://
,GetDirectoryName
将其更改为普通的Windows格式。