首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序集CodeBase给出错误的位置

程序集CodeBase给出错误的位置
EN

Stack Overflow用户
提问于 2018-02-02 19:46:45
回答 2查看 1.4K关注 0票数 0

我正在使用ExcelDna编写一个Excel插件。我希望找到安装程序集的目录,以便从该目录打开文件。我过去曾成功地使用过这种方法,但是在升级到.NET Framework4.7.1之后,它无法工作。我想找出原因。

下面是我当前插件中的内容:

代码语言:javascript
复制
var codePath = Assembly.GetExecutingAssembly().CodeBase;

当我在调试器中悬停在它上面时,它给出了正确的路径。在我执行语句之后,codePath有mscorlib的位置(并且在它上方盘旋,调试器仍然有正确的位置)。我还尝试过使用typeof(<typeWithNoIneritance>).Assembly.CodeBase和使用Location而不是CodeBase的变体。

接下来我该看什么?

更新问题可能不是.NET框架更新,而是我同时做的ExcelDna更新。它从字节数组加载文件,该数组无法提供文件位置信息。我可以禁用它,它现在正在工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-02 19:56:23

更新

在深入研究之后(请参阅对此答案的注释),它看起来就像Excel,或者运行时加载插件的任何机制,它使用的是Assembly.Load方法,它接受一个byte[]而不是一个文件。(换句话说,它首先将程序集作为byte[]加载到内存中,然后将其加载到AppDomain中)。因此,.NET运行时实际上并不知道文件的位置,因此将返回.Location (文档)的空字符串或调用者的.CodeBase代码基(文档)。

不幸的是,这意味着没有一种很好的方法可以通过反射来确定文件的来源。

先前的答案

听起来您的代码正在获取JIT内嵌优化,因此我将尝试将查找放到一个单独的方法中,并添加一个属性来指示CLR不要内联该方法。

代码语言:javascript
复制
    [MethodImpl(MethodImplOptions.NoInlining)]
    public string GetLocation()
    {
        return this.GetType().Assembly.Location;
    }

如果要查找包含该代码行的程序集的路径,则需要使用

代码语言:javascript
复制
this.GetType().Assembly.Location

有关CodeBaseAssembly之间差异的更多信息,请查看https://blogs.msdn.microsoft.com/suzcook/2003/06/26/assembly-codebase-vs-assembly-location/

票数 4
EN

Stack Overflow用户

发布于 2018-02-02 19:56:14

使用Assembly.Location代替。

代码语言:javascript
复制
var codePath = Assembly.GetExecutingAssembly().Location;

CodeBase是指向文件所在位置的URL,而Location是从它实际加载的路径。

引用自这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48589883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档