我正在尝试使用Moles 0.94.51023.0来破坏VS 2010 SP1中的System.ServiceModel v4并且我一直得到以下错误: 命名空间'ssm :: System.ServiceModel.Channels'中不存在类型或命名空间名称'IHttpCookieContainerManager'(您是否缺少程序集引用?)[my-test-project.Test \ obj \ Debug \ Moles \ ssm \ mgcsproj] my-test-project.Test \ mgcs 293022 43
此接口似乎已从.NET 4.0中的System.ServiceModel.dll中删除,因为当我在对象浏览器中搜索时,我只能在System.ServiceModel.dll v2.0.5.0(Silverlight)中找到它。
我可以使用moles.exe通过cmdline重现这一点,我尝试改变moles文件只生成我指定的类型名称,但似乎没有任何区别。这在我升级到VS2010 SP1之前工作正常,所以我怀疑它是一个错误,但任何帮助都将不胜感激。
由于 尼克
答案 0 :(得分:5)
我自己调试了这个,发现根本原因似乎是VS2010 SP1(以及相关的GDR KB update for .NET 4)更新了一组DLL而不是另一组:
%ProgramFiles(x86)%\ Referenced Assemblies \中的System.ServiceModel.dll与%windir%\ Microsoft.NET \ Framework64 \ v4.0.30319中的.NET v4安装中的系统不匹配... < / p>
发布VS 2010 SP1更新:
%Program Files(x86)%\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.ServiceModel.dll - &gt;文件版本4.0.30319.1
%windir%\ Microsoft.NET \ Framework64 \ v4.0.30319 \ System.ServiceModel.dll - &gt;文件版本4.0.30319.225
在VS中的对象浏览器中以及在Reflector中比较这两个dll会产生IHttpCookieContainerManager接口已在较新文件中删除的结果。所以我怀疑这是.NET探测找到较新的DLL和Moles在做鼹鼠/存根生成时反映旧版本的组合。我可以通过手动运行Moles exe而不使用任何类型的引用路径来手动为新DLL生成Moles dll,而不是在构建期间添加一堆ref路径的MSBuild目标。
答案 1 :(得分:4)
我不知道发生了为什么,但我遇到了同样的问题,我通过使用Moles类型过滤器来解决它,并且只包括我真正需要的那些(它有好的一面) - 加速编译的效果相当多!!)。这是我正在使用的示例.moles
文件:
<Moles xmlns="http://schemas.microsoft.com/moles/2010/">
<Assembly Name="System.ServiceModel"/>
<StubGeneration>
<Types>
<Clear/>
<Add Namespace="System.ServiceModel.Description!"/>
</Types>
</StubGeneration>
</Moles>
答案 2 :(得分:1)
看起来这是Moles用于编译的System和System.ServiceModel程序集之间的冲突。
我最近安装了Microsoft .NET Framework 4.5。
卸载后再重新安装4.0一切正常。
答案 3 :(得分:0)
好吧,如果有人正在使用遗留代码并且碰巧被逼入使用Microsoft Moles,我已经对这个主题进行了大量的挖掘,并希望从我遇到的愤怒和挫折中拯救一些。
我尝试使用接受的答案的建议,这意味着转到Moles目录(在C:\ Program Files ..中)并以管理员身份运行命令行实用程序(moles.exe)。有很多选项,其中一个允许您包含引用的程序集(如上所述)。
但是,即使尝试在没有引用程序集的情况下运行该实用程序,该实用程序最终也会使用预定义的引用程序集路径调用C#编译器(csc.exe),这就是我得出结论.NET Framework版本之间发生混淆的地方。我无法让不包含这些汇编路径。
我的具体情况是我试图捣毁一个自定义程序集,但是因为,显然我在这台机器上安装了.NET 4.5,它抱怨编译System.Collections.Generics IReadOnlyCollection,IReadOnlyDictionary,我想另一个。
解决方案:我开始使用的唯一解决方案是使用Mole过滤器,我在其他帖子和Microsoft Moles网站上阅读过(有一个特殊的主页上的.NET 4.5故障排除链接)。在Visual Studio中,我只需通过右键单击解决方案资源管理器,将Moles程序集添加到我的单元测试项目中,以用于我引用的自定义程序集然后我试着建立。对于我收到的每个错误,我注意到了有问题的类,并通过在moles文件中添加以下内容将它们排除在Shimmed或Stubbed之外:
<Moles xmlns="http://schemas.microsoft.com/moles/2010/">
<Assembly Name = "MyCustomAssembly" />
<StubGeneration>
<Types>
<Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
</Types>
</StubGeneration>
<MoleGeneration>
<Types>
<Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
</Types>
</MoleGeneration>
</Moles>
现在很明显,如果你需要那些你从鼹鼠/存根生成中排除的类,那就没有用了,但是对于我的情况它运行正常,因为违规类并不重要而且我不会在这些课程中,不需要Stub或Shim任何东西。