【问题标题】:Returning or inheriting a generic that contains a nested class返回或继承包含嵌套类的泛型
【发布时间】:2011-05-14 09:07:21
【问题描述】:

在使用如下所示的类布局时,我注意到一些极其奇怪的行为:

// Contents of assembly A:
public class MyParentClass
{
    public class NestedClass
    {
    }
}

// Contents of assembly B:
public class AnotherClass : List<MyParentClass.NestedClass>
{
}

我可以将程序集 A 添加为程序集 B 的依赖项。此示例将在没有任何错误消息的情况下编译,但是当涉及到,例如,加载程序集 B 作为单元测试的参考时,我会收到此错误消息是时候编译单元测试了:

无法加载文件或程序集“AssemblyB,版本=1.0.0.0,文化=中性, PublicKeyToken=null' 或其依赖项之一。系统找不到 指定文件。

此代码生成的程序集确实有效,我可以使用 Redgate Reflector 运行生成的 DLL 并按预期查看我的代码,但单元测试拒绝加载它。

我几乎肯定这个问题与我正在调用另一个程序集中的嵌套类这一事实有关,无论如何我可能最终会重构这个设计,但我真的很想知道为什么会这样不能按预期工作。如果以这种方式使用类有问题,我希望编译器会抛出异常。

感谢您的宝贵时间。

【问题讨论】:

  • 您是否在单元测试程序集中同时加载程序集 A 和 B?

标签: c# generics nested-generics


【解决方案1】:

是否为该引用启用了“复制本地”?我假设您的测试项目测试程序集 B 没有程序集 A 的副本。在引用上将“复制本地”设置为 true 应该复制程序集,以便在编译(并最终运行)测试时可以正确找到它们.

【讨论】:

  • 实际上,程序集 B 也加载了单元测试项目。在所有情况下,“复制本地”都设置为 True,所以我不认为这是问题所在。好主意。
【解决方案2】:

我怀疑这与嵌套类有什么关系——只是在 .NET 中缺乏传递依赖。

基本上,如果您要在一个项目中使用AnotherClass,则需要显式添加对AssemblyBAssemblyA 的引用。这样,两者都应该被适当地复制和加载。

如果这没有帮助,您可以尝试enabling fusion logging

【讨论】:

  • 我在我的单元测试项目中添加了对这两个程序集的引用,所以这不是问题。绑定日志窗口中也没有出现任何内容,但我以前从未遇到过该工具,所以这仍然是我学到的新东西。谢谢!
  • 上次我检查(几年前)Fuslogvw.exe 有点不灵活。所以我宁愿把我的融合日志放到某个文件夹中。更改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion”,将 ForceLog 和 LogFailures 设置为 1 并设置 LogPath=C:\Temp\FusionLog 并创建该文件夹。
【解决方案3】:

如果您的项目将目标框架设置为“框架 4 客户端配置文件”并且链接的 dll 具有目标框架“框架 4”,您会在 Visual Studio 2010 中收到此错误消息。

在您的项目设置中检查。

【讨论】:

  • 我所有的项目都有“.NET Framework 4”的目标。无论如何谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多