在签名程序集中的内部接口上使用 Moq 时出现 TypeLoadException

问题描述 投票:0回答:2

我正在 Visual Studio 2013 中使用最新的 Moq (4.2.1502.911) 来模拟另一个项目中包含的内部接口。两个项目都使用相同的密钥进行签名。在此处和网络上其他地方搜索后,我想我必须为测试程序集和“DynamicProxyGenAssembly2”添加InternalsVisibleTo,使用Moq的公钥,如下所示:

[assembly: InternalsVisibleTo("UnitTestProject1, PublicKey=00240000048000009...
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=002400000...

现在,当我运行测试方法时,我仍然收到以下错误:

Test Name:  TestMethod1
Test FullName:  UnitTestProject1.Class1Test.TestMethod1
Test Source:    c:\Users\******\Documents\Visual Studio 2013\Projects\MoqTest\UnitTestProject1\UnitTest1.cs : line 13
Test Outcome:   Failed
Test Duration:  0:00:00,0693592

Result Message: 
Test method UnitTestProject1.Class1Test.TestMethod1 threw exception: 
System.TypeLoadException: Le type 'Castle.Proxies.IFooProxy' de l'assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=a621a9e7e5c32e69' essaye d'implémenter une interface inaccessible.
Result StackTrace:  
à System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type)
   à System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
   à System.Reflection.Emit.TypeBuilder.CreateType()
   à Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder type)
   à Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType()
   à Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator.GenerateType(String typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope)
   à Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.<>c__DisplayClass1.<GenerateCode>b__0(String n, INamingScope s)
   à Castle.DynamicProxy.Generators.BaseProxyGenerator.ObtainProxyType(CacheKey cacheKey, Func`3 factory)
   à Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options)
   à Castle.DynamicProxy.DefaultProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
   à Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors)
   à Moq.Proxy.CastleProxyFactory.CreateProxy(Type mockType, ICallInterceptor interceptor, Type[] interfaces, Object[] arguments)
   à Moq.Mock`1.<InitializeInstance>b__2()
   à Moq.PexProtector.Invoke(Action action)
   à Moq.Mock`1.InitializeInstance()
   à Moq.Mock`1.OnGetObject()
   à Moq.Mock`1.get_Object()
   à UnitTestProject1.Class1Test.TestMethod1() dans c:\Users\******\Documents\Visual Studio 2013\Projects\MoqTest\UnitTestProject1\UnitTest1.cs:ligne 15

(英文:

System.TypeLoadException : Type 'Castle.Proxies.IFooProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=a621a9e7e5c32e69' is attempting to implement an inaccessible interface.

还有其他事情要做才能让它发挥作用吗? 这是一个最小的可编译示例:https://www.dropbox.com/s/c2slwq4do5ttp9p/MoqTest.zip?dl=0

c# moq
2个回答
17
投票

使用以下公钥值解决了我的问题:

0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104 f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf 74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7

我最初尝试使用 sn.exe 获取公钥,但我认为它返回的公钥是针对 Moq 而不是 DynamicProxyGenAssembly2。我从 Moq GitHub 页面获得了上述密钥:

https://github.com/Moq/moq4/wiki/Quickstart

// This assembly is the default dynamic assembly generated Castle DynamicProxy, 
// used by Moq. Paste in a single line.   
[assembly:InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]

0
投票

就我而言,虽然错误消息建议使用公共密钥进行起订量,但修复方法是不使用公共密钥,所以:

[assembly:InternalsVisibleTo("DynamicProxyGenAssembly2")]

或者,在 csproj 文件中:

<ItemGroup>
  <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
    <_Parameter1>DynamicProxyGenAssembly2</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>
© www.soinside.com 2019 - 2024. All rights reserved.