为什么当使用NET40-NoCastle时,'Moq.Proxy.CastleProxyFactory'类型初始值设定项异常?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (220)

所以我几乎逐字地从Moq主页复制了示例代码,并且得到了一个城堡代理异常。

这是我的代码(作为一个简单示例的控制台应用程序)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Moq;

namespace MoqTestConsole
{
    public interface ILoveThisFramework
    {
        bool DownloadExists(string s);
    }

    class Program
    {
        static void Main(string[] args)
        {
            Mock<ILoveThisFramework> mock = new Mock<ILoveThisFramework>();

            // WOW! No record/replay weirdness?! :)
            mock.Setup(framework => framework.DownloadExists("2.0.0.0")).Returns(true);

            // Hand mock.Object as a collaborator and exercise it, 
            // like calling methods on it...
            ILoveThisFramework lovable = mock.Object;
            bool download = lovable.DownloadExists("2.0.0.0");

            // Verify that the given method was indeed called with the expected value
            mock.Verify(framework => framework.DownloadExists("2.0.0.0"));
        }
    }
}

一切都很好编译,但是当它调用时mock.Object抛出下面的异常。

System.TypeInitializationException was unhandled
  Message=The type initializer for 'Moq.Mock`1' threw an exception.
  Source=Moq
  TypeName=Moq.Mock`1
  StackTrace:
       at Moq.Mock`1.<InitializeInstance>b__0() in d:\Code\moq\src\Source\Mock.Generic.cs:line 138
       at Moq.PexProtector.Invoke(Action action) in d:\Code\moq\src\Source\PexProtector.cs:line 56
       at Moq.Mock`1.InitializeInstance() in d:\Code\moq\src\Source\Mock.Generic.cs:line 136
       at Moq.Mock`1.OnGetObject() in d:\Code\moq\src\Source\Mock.Generic.cs:line 153
       at Moq.Mock.GetObject() in d:\Code\moq\src\Source\Mock.cs:line 152
       at Moq.Mock.get_Object() in d:\Code\moq\src\Source\Mock.cs:line 147
       at Moq.Mock`1.get_Object() in d:\Code\moq\src\Source\Mock.Generic.cs:line 131
       at MoqTestConsole.Program.Main(String[] args) in C:\Projects\Test\MoqTestConsole\MoqTestConsole\Program.cs:line 25
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.TypeInitializationException
       Message=The type initializer for 'Moq.Proxy.CastleProxyFactory' threw an exception.
       Source=Moq
       TypeName=Moq.Proxy.CastleProxyFactory
       StackTrace:
            at Moq.Proxy.CastleProxyFactory..ctor()
            at Moq.Mock`1..cctor() in d:\Code\moq\src\Source\Mock.Generic.cs:line 54
       InnerException: System.IO.FileNotFoundException
            Message=Could not load file or assembly 'Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.
            Source=Moq
            FileName=Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc
            FusionLog==== Pre-bind state information ===
LOG: User = jsi-dev-001\jmacintyre
LOG: DisplayName = Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc
 (Fully-specified)
LOG: Appbase = file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : Moq, Version=4.0.10827.0, Culture=neutral, PublicKeyToken=69f491c39445e920.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core.DLL.
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core/Castle.Core.DLL.
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core.EXE.
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core/Castle.Core.EXE.

            StackTrace:
                 at Moq.Proxy.CastleProxyFactory..cctor()
            InnerException: 

所以它似乎是一个Castle Proxy组件,但我正在引用NET40-NoCastle目录中的二进制文件。

提问于
用户回答回答于

事实证明,问题在于我使用的是NET40-NoCastle二进制文件,这显然意味着您正在使用Castle Windsor,并且已经在您的项目中使用了Castle Windsor二进制文件。我有misassumption这个目录是为项目使用Castle Windsor。

扫码关注云+社区

领取腾讯云代金券