汇编CodeBase提供错误的位置

时间:2018-02-02 19:46:46

标签: c# reflection

我正在使用ExcelDna编写Excel插件。我想找到程序集安装的目录,以便我可以从该目录中打开文件。我过去已成功使用此方法,但在升级到.NET Framework 4.7.1后它不起作用。我试图找出原因。

这是我目前插件中的内容:

var codePath = Assembly.GetExecutingAssembly().CodeBase;

当我将鼠标悬停在调试器中时,它会给出正确的路径。在我执行语句后codePath具有mscorlib的位置(并将其悬停在调试器上仍然具有正确的位置)。我还使用typeof(<typeWithNoIneritance>).Assembly.CodeBase并使用Location代替CodeBase尝试了变体。

接下来我应该看什么?

更新 问题可能不是.NET Framework更新,而是我同时执行的ExcelDna更新。它是从一个字节数组加载文件,它不能提供文件位置信息。我能够禁用它,它现在正在工作。

2 个答案:

答案 0 :(得分:0)

改为使用Assembly.Location

var codePath = Assembly.GetExecutingAssembly().Location;
  

CodeBase 是找到文件的地方的网址,而位置是实际加载文件的路径。

引自here

答案 1 :(得分:0)

更新

进一步挖掘后(参见本答案的评论),看起来像Excel,或者在运行时加载插件的任何机制,都是使用Assembly.Load方法,它采用byte[]而不是文件。 (换句话说,它首先将程序集作为byte[]加载到内存中,然后将其加载到AppDomain中)。因此,.NET运行时实际上并不知道文件位置,因此将返回.Locationdoc)的空字符串或{{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/