我正在使用ExcelDna编写Excel插件。我想找到程序集安装的目录,以便我可以从该目录中打开文件。我过去已成功使用此方法,但在升级到.NET Framework 4.7.1后它不起作用。我试图找出原因。
这是我目前插件中的内容:
var codePath = Assembly.GetExecutingAssembly().CodeBase;
当我将鼠标悬停在调试器中时,它会给出正确的路径。在我执行语句后codePath
具有mscorlib的位置(并将其悬停在调试器上仍然具有正确的位置)。我还使用typeof(<typeWithNoIneritance>).Assembly.CodeBase
并使用Location
代替CodeBase
尝试了变体。
接下来我应该看什么?
更新 问题可能不是.NET Framework更新,而是我同时执行的ExcelDna更新。它是从一个字节数组加载文件,它不能提供文件位置信息。我能够禁用它,它现在正在工作。
答案 0 :(得分:0)
改为使用Assembly.Location
。
var codePath = Assembly.GetExecutingAssembly().Location;
CodeBase 是找到文件的地方的网址,而位置是实际加载文件的路径。
引自here。
答案 1 :(得分:0)
更新
进一步挖掘后(参见本答案的评论),看起来像Excel,或者在运行时加载插件的任何机制,都是使用Assembly.Load方法,它采用byte[]
而不是文件。 (换句话说,它首先将程序集作为byte[]
加载到内存中,然后将其加载到AppDomain中)。因此,.NET运行时实际上并不知道文件位置,因此将返回.Location
(doc)的空字符串或{{1}的调用方代码库(doc)。
不幸的是,这意味着通过Reflection确定文件的来源并不是一个好方法。
上一个答案
听起来你的代码正在获得JIT inline optimized,所以我会尝试将查询拉入单独的方法并添加一个属性来指示CLR不要内联该方法。
.CodeBase
如果您正在寻找包含该代码行的程序集路径,那么您将要使用
[MethodImpl(MethodImplOptions.NoInlining)]
public string GetLocation()
{
return this.GetType().Assembly.Location;
}
有关this.GetType().Assembly.Location
和CodeBase
之间差异的更多信息,请结帐https://blogs.msdn.microsoft.com/suzcook/2003/06/26/assembly-codebase-vs-assembly-location/