0

我正在尝试使用Unity解决TimeSpan。执行容器 Resolve 调用会导致FatalExecutionEngineError

检测到 FatalExecutionEngineError 消息:运行时遇到致命错误。错误地址位于线程 0x1bb8 上的 0x543c3dc8。错误代码为 0xc0000005。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。

在 DEBUG 中运行测试会导致调试器请求以下文件。

X:\Unity\Src\ObjectBuilder\Strategies\BuildPlan\DynamicMethod\DynamicMethodBuildPlan.cs

它在第 38 行显示了以下ExecutionEngineException

System.ExecutionEngineException 未处理 Message="抛出了 'System.ExecutionEngineException' 类型的异常。" 内部异常:

测试

[TestClass]
public class Example
{
    private readonly IUnityContainer container = new UnityContainer();

    [TestInitialize]
    public void TestInitialize()
    {
        container.Register<TimeSpan>(new ExternallyControlledLifetimeManager());
    }

    [TestMethod]
    public void Test()
    {
        var expected = new TimeSpan();
        var actual = container.Resolve<TimeSpan>();
        Assert.AreEqual(expected, actual);
    }
}
4

2 回答 2

2

我不确定您为什么会收到错误,但我尝试将类型配置(在您编辑的配置文件中)替换为以下内容。

<instances>
   <add name="MyTimeSpan" type="System.TimeSpan" value="1.02:03:04"  />
</instances>

var duration = container.Resolve<TimeSpan>("MyTimeSpan");

以上应返回持续时间为 1 天 2 小时 3 分钟 4 秒的时间跨度。

(我用 Unity 4.1 试过这个)

于 2009-12-03T22:15:53.377 回答
0

解析 TimeSpan 时出现致命的执行引擎错误

在 Unity CodePlex 网站上发布了这个问题。已经回答了。

在当前位中,您会得到正确的 "InvalidOperationException"。TimeSpan 有多个构造函数,默认情况下它选择四个参数的一个,然后不知道要提供什么整数。结构实际上没有零参数的构造函数, clr 在幕后“作弊”。

解决方案是告诉 Unity 使用哪个构造函数。

container.Register<TimeSpan>(new ExternallyControlledLifetimeManager(), 
    new InjectionConstructor(0L));
于 2010-01-07T14:42:03.633 回答