6

我正在尝试使用 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 之前这工作正常,所以我怀疑这是一个错误,但任何帮助将不胜感激。

谢谢尼克

4

4 回答 4

5

我自己也对此进行了调试,发现根本原因似乎是 VS2010 SP1(以及.NET 4 的相关 GDR KB 更新)更新了一组 DLL 而不是另一组:

%ProgramFiles(x86)%\Referenced Assemblies\ 中的 System.ServiceModel.dll 与 .NET v4 安装在 %windir%\Microsoft.NET\Framework64\v4.0.30319 中的不匹配...

发布 VS 2010 SP1 更新:

%Program Files(x86)%\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.ServiceModel.dll -> 文件版本 4.0.30319.1

%windir%\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.dll -> 文件版本 4.0.30319.225

在 VS 和 Reflector 中的对象浏览器中比较这两个 dll 得出的结果是 IHttpCookieContainerManager 接口已在较新的文件中被删除。因此,我怀疑这是 .NET 探测发现较新的 DLL 和 Moles 在生成痣/存根时反映较旧的 DLL 的组合。我能够通过手动运行 Moles exe 为较新的 DLL 手动生成 Moles dll,没有任何类型的引用路径,而不是在构建期间添加一堆引用路径的 MSBuild 目标。

于 2011-05-18T02:59:12.063 回答
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>
于 2011-05-14T17:36:35.847 回答
1

看起来这是 Moles 用于编译的 System 和 System.ServiceModel 程序集之间的冲突。

我最近安装了 Microsoft .NET Framework 4.5。

卸载它并重新安装 4.0 后一切正常。

于 2013-04-01T17:34:08.997 回答
0

好吧,如果有人正在使用遗留代码并且碰巧使用 Microsoft Moles,我已经对这个主题进行了广泛的挖掘,希望能从我遇到的愤怒和沮丧中拯救一些人。

我尝试使用已接受答案的建议,这意味着转到 Moles 目录(在 C:\Program Files.. 中)并以管理员身份运行命令行实用程序 (moles.exe)。有很多选项,其中之一允许您包含引用的程序集(如上所述)。

但是,即使尝试在没有引用程序集的情况下运行该实用程序,该实用程序最终也会使用预定义的引用程序集路径调用 C# 编译器 (csc.exe),这就是我得出的结论,即 .NET Framework 版本之间会出现混淆。我无法不包含这些装配路径。

我的具体情况是我试图 Mole 一个自定义程序集,但是因为显然我在这台机器上安装了 .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>

现在很明显,如果您需要从痣/存根生成中排除的类,那么这将不起作用,但是就我而言,它工作得很好,因为有问题的类并不重要,而且我不需要存根或填充任何东西那些课。

于 2016-01-06T16:30:59.850 回答