假设我有一个包含 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] 删除。
我来说两句