原始程序集的位置(不是当前执行的)

布拉德·谢拉德

假设我有一个包含 4 个项目的解决方案,A、A_UnitTests、B 和 B_UnitTests。

项目 A 有一个数据文件,该文件作为 A_UnitTests 的链接添加并设置为复制到输出目录。当运行单元测试或在生产中执行代码时,使用以下代码片段正确识别该文件的路径:

public static string GetFullPath(string relativePath)
{
    string retVal = string.Empty;
    if (System.Web.HttpContext.Current == null)
    {
        string locationBeforeShadowCopy = typeof(A.SomeClassInA).Assembly.CodeBase;
        UriBuilder uri = new UriBuilder(locationBeforeShadowCopy);
        string locationWithoutUriPrefixes = Uri.UnescapeDataString(uri.Path);
        string dir = Path.GetDirectoryName(locationWithoutUriPrefixes);
        retVal = Path.Combine(dir, relativePath);
    }
    else
    {
        // stuff that doesn't matter
    }

    return retVal;
}

但是,我在 B_UnitTests 中有一个新的测试用例,它尝试使用此代码路径来查找文件位置。但是,即使我调用typeof(A.SomeClassInA).Assembly.CodeBase,它也是从 B_UnitTests 调用的,使用其引用的 DLL。这意味着路径返回是 B_UnitTests 输出目录 + 相对路径。所以它没有找到数据文件。

如果不求助于硬编码设置和构建脚本,我可以使用什么来指定正确的路径?

更新(澄清)真正的问题是 typeForClassInA.Assembly.CodeBase 返回执行程序集的路径而不是 A 本身。提供来自某个程序集的类型而不是返回原始程序集位置,而是返回执行程序集的路径,而该程序集恰好具有对它的引用,这似乎是非常错误的。

理查迪西莫

如果存在对“typeForClassInA”的引用,则其程序集将被复制到 B_UnitTests 的输出目录中。因此,当您从 B_UnitTests 中的测试中请求该类型程序集的 CodeBase 时,它​​(正确)指向 B_UnitTests 输出文件夹中程序集 A 的版本,因为它是从那里加载的。

我承认我避免使用 Shadow Copy 来避免定位程序集旁边的资源的这些类型的问题,因为 ShadowCopy 不知道它们是需要的,并且它们不会被影子复制。

另一件有帮助的事情是通过将所有项目输出文件夹更改为“..\bin”,将所有项目构建到同一个输出文件夹中。例如,这意味着 A_UnitTests 不需要资源文件的链接(一旦关闭了卷影副本)。

我有一种类似于您展示的方法,它从程序集的位置(对我来说是共享 bin 文件夹)到解决方案的位置“向上”;并且我的相对路径在该文件夹中“扎根”。

如果这一切听起来太复杂,您可以使用与 A_UnitTests 相同的方法,包括从 B_UnitTests 到它的链接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

获取程序集的原始源代码位置

说“联合当前是基于位置而不是模式执行的”是什么意思?

Maven 程序集插件压缩 jar.original 内容而不是可执行 jar

获取当前位置而不是缓存iOS

执行Numba生成的程序集

MSI执行VB.net应用程序,当前用户返回系统用户,而不是登录用户

放置api集位置基于当前位置的偏向

从.dll执行程序程序集获取

需要Android中用户的当前位置,而不是最近的位置

捕获当前线程的执行程序

如何更喜欢Nuget程序集而不是SDK程序集?

Scala /列表-引用当前过滤列表以获取当前大小(而不是原始大小)的任何方法

无法加载参考程序集以执行

如何获得执行程序集的版本?

如何从执行程序集引用库?

获取引用本地程序集的位置

程序集引用的位置在哪里?

AS86设置原始地址(x86程序集)

如何从当前位置(而不是父对象)定位(偏移)绝对元素?

程序的答案集-为什么空集不是答案集?

获取当前目录名称程序集8086 TASM

过滤名称空间中的所有程序集(当前程序集除外)

如何获取当前 api 的完整 url 而不是原始请求者的

关闭应用程序的实例而不是当前的实例

获取应用程序而不是设备Android的当前语言

杀死脚本,但允许当前正在执行的程序退出

列出当前正在程序上执行的bash完成?

单声道执行当前目录错误的程序

无法在Flutter应用程序中加载当前位置