我有一个C#DLL,需要知道其在磁盘上的位置,以便它可以找到伴随文件。我已经在使用Assembly.CodeBase,以便无论是否通过NUnit对其进行阴影复制(如this question的答案所建议的那样),我的代码都能正常工作。
但是,当我使用#r
将程序集加载到Visual Studio中的“ C#Interactive”窗口中,然后在程序集中调用方法时,Assembly.CodeBase返回一个临时路径。我已经从代码中看到了这一点,但是在C#Interactive窗口本身中重现更为简单:
> #r "C:\path\to\my.assembly.dll"
> typeof(SomeTypeFromMyAssembly).Assembly.CodeBase
"file:///C:/Users/me/AppData/Local/Temp/InteractiveHostShadow/314264c8-e9c6-42b9-8e1d-100a30d4fbd9/8c9a9e04-58fb-4b16-8447-c68cb3a818b8/my.assembly.dll"
因此,它不是返回Assembly.CodeBase照常返回DLL的原始路径(甚至对于阴影复制的文件),而是返回一个temp目录,这显然是C#Interactive通过某些非常规方式将其复制的地方。 / p>
我用Google搜索了路径的“ InteractiveHostShadow”部分,它出现在C#Interactive的源代码中的InteractiveHost.Service.cs中:
_metadataFileProvider = new MetadataShadowCopyProvider(
Path.Combine(Path.GetTempPath(), "InteractiveHostShadow"),
noShadowCopyDirectories: s_systemNoShadowCopyDirectories,
documentationCommentsCulture: new CultureInfo(cultureName));
但是我对MetadataShadowCopyProvider不够熟悉,无法知道如何摆脱其影子复制(显然不同于常规的影子复制)来获取原始DLL路径。
如何以一种适合C#Interactive使用的特殊阴影复制方式的方式,找到从中加载程序集的原始路径?