- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
好吧,现在我真的很困惑。
我原来有this problem ,根据海报,这是 CaSTLe.DynamicProxy 版本的一个问题,ILMerged 到最新的 Rhino.Mocks 库中。根据有关该主题的几位权威人士的说法,它已在最新的 CaSTLe 中得到修复,但该库尚未将其纳入新的 Rhino.Mocks 中。大多数人都说“只需下载 Rhino 源代码和最新的 CaSTLe 并构建您自己的版本”。
所以,我就是这么做的;我从 Ayende 的 GitHub 上抓取了一个 Rhino trunk 源码的 ZIP,打开并构建了它。然后,像一个优秀的 TDDer 一样,我创建了一个单元测试以确保我的更改有效(因为最新的 CaSTLe 将 DynamicProxy 折叠到 Core 中,需要一些重要的引用更改):
[Test]
public void MockOfInterfaceMethodWithInterfaceGTR()
{
var mock = mocks.DynamicMock<ITestRestrictedInterface>();
Assert.NotNull(mock);
Expect.Call(mock.TestMethod(new Object2())).IgnoreArguments().Return(5);
mocks.ReplayAll();
Assert.AreEqual(5, mock.TestMethod(new Object2()));
}
...
internal interface ITestGenericInterface<TRest> where TRest:IObject1
{
int TestMethod<T>(T input) where T : TRest;
}
internal interface ITestRestrictedInterface:ITestGenericInterface<IObject2> { }
internal interface IObject1 { }
internal interface IObject2:IObject1 { }
internal class Object2:IObject2 { }
结果是在我自己的生产代码中使用最新发布的 Rhino 运行时?失败并显示以下消息:
System.TypeLoadException : Method 'TestMethod' on type 'ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' tried to implicitly implement an interface method with weaker type parameter constraints.
...但是,当我将此测试复制并粘贴到 Rhino.Mocks.Tests 项目中的夹具中,而不对引用的库进行任何更改时,测试通过。我对下载的源代码进行了零更改。我对双方的测试方法和相关接口(interface)/对象进行了零更改。我构建了一个新的 Rhino.Mocks DLL(没有 IL 合并 CaSTLe 库)并将其与 CaSTLe 库一起复制回我的生产解决方案,重新运行测试,它仍然失败并显示相同的消息。
什么鬼?
最佳答案
我不是 CaSTLe 专家也不是编译器大师,但我相信这个问题是隐藏在 RhinoMocks.Tests 程序集中的一点魔法:
来自 https://github.com/ayende/rhino-mocks/blob/master/Rhino.Mocks.Tests/TestInfo.cs
using System.Runtime.CompilerServices;
using Rhino.Mocks;
[assembly: InternalsVisibleTo(RhinoMocks.StrongName)]
为了完整起见,RhinoMocks.StrongName 定义为:
/// <summary>
/// Used for [assembly: InternalsVisibleTo(RhinoMocks.StrongName)]
/// Used for [assembly: InternalsVisibleTo(RhinoMocks.NormalName)]
/// </summary>
public static class RhinoMocks
{
/// <summary>
/// Strong name for the Dynamic Proxy assemblies. Used for InternalsVisibleTo specification.
/// </summary>
public const string StrongName =
"DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7";
/// <summary>
/// Normal name for dynamic proxy assemblies. Used for InternalsVisibleTo specification.
/// </summary>
public const string NormalName = "DynamicProxyGenAssembly2";
/// <summary>
/// Logs all method calls for methods
/// </summary>
public static IExpectationLogger Logger = new NullLogger();
}
我在使用 Moq 时遇到过类似的问题,which has this issue documented .
问题是 CaSTLe 中的 DynamicProxy 需要动态派生新类型,但无法看到您的程序集内部接口(interface)。只需将 InternalsVisibleTo 添加到 DynamicProxyGenAssembly2 到您的测试库中即可解决问题。
关于c# - CaSTLe DynamicProxy - 创建涉及用作 GTR 的 GTP 的代理时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186087/
华米科技 Amazfit 官方表示,Amazfit GTR、Amazfit GTS 全系列固件更新已发布。IT之家获悉,本次面向 Amazfit GTR 47 mm/42 mm、Amazfit GT
根据我的代码,如果%~1大于7000,则转到ExceedError IF "%~1" GTR "7000" GOTO ExceedError ExceedError 的内容: ECHO Value e
根据我的代码,如果%~1大于7000,则转到ExceedError IF "%~1" GTR "7000" GOTO ExceedError ExceedError 的内容: ECHO Value e
rem 比较运算符: EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 例如
好吧,现在我真的很困惑。 我原来有this problem ,根据海报,这是 CaSTLe.DynamicProxy 版本的一个问题,ILMerged 到最新的 Rhino.Mocks 库中。根据有关
3 月 3 日消息 华米科技宣布,Amazfit GTR 2 与 Amazfit GTS 2 智能手表已支持微信支付。 用户只需将 Amazfit GTR 2、Amazfit GTS 2 智能
华米今天发布了 GTR 2 智能手表,搭载血氧、心率引擎,运动版售价 999 元,皮质表带版售价 1099 元。 IT之家了解到,Amazfit GTR 2 拥有一块 1.39 英寸、
我是一名优秀的程序员,十分优秀!