我正在使用ExcelDna编写一个Excel插件。我希望找到安装程序集的目录,以便从该目录打开文件。我过去曾成功地使用过这种方法,但是在升级到.NET Framework4.7.1之后,它无法工作。我想找出原因。
下面是我当前插件中的内容:
var codePath = Assembly.GetExecutingAssembly().CodeBase;当我在调试器中悬停在它上面时,它给出了正确的路径。在我执行语句之后,codePath有mscorlib的位置(并且在它上方盘旋,调试器仍然有正确的位置)。我还尝试过使用typeof(<typeWithNoIneritance>).Assembly.CodeBase和使用Location而不是CodeBase的变体。
接下来我该看什么?
更新问题可能不是.NET框架更新,而是我同时做的ExcelDna更新。它从字节数组加载文件,该数组无法提供文件位置信息。我可以禁用它,它现在正在工作。
发布于 2018-02-02 19:56:23
更新
在深入研究之后(请参阅对此答案的注释),它看起来就像Excel,或者运行时加载插件的任何机制,它使用的是Assembly.Load方法,它接受一个byte[]而不是一个文件。(换句话说,它首先将程序集作为byte[]加载到内存中,然后将其加载到AppDomain中)。因此,.NET运行时实际上并不知道文件的位置,因此将返回.Location (文档)的空字符串或调用者的.CodeBase代码基(文档)。
不幸的是,这意味着没有一种很好的方法可以通过反射来确定文件的来源。
先前的答案
听起来您的代码正在获取JIT内嵌优化,因此我将尝试将查找放到一个单独的方法中,并添加一个属性来指示CLR不要内联该方法。
[MethodImpl(MethodImplOptions.NoInlining)]
public string GetLocation()
{
return this.GetType().Assembly.Location;
}如果要查找包含该代码行的程序集的路径,则需要使用
this.GetType().Assembly.Location有关CodeBase和Assembly之间差异的更多信息,请查看https://blogs.msdn.microsoft.com/suzcook/2003/06/26/assembly-codebase-vs-assembly-location/
发布于 2018-02-02 19:56:14
使用Assembly.Location代替。
var codePath = Assembly.GetExecutingAssembly().Location;CodeBase是指向文件所在位置的URL,而Location是从它实际加载的路径。
引用自这里。
https://stackoverflow.com/questions/48589883
复制相似问题