我正在尝试使用TimeSpan解析Unity。执行容器在FatalExecutionEngineError中解析调用结果。
检测到FatalExecutionEngineError 消息:运行时遇到致命错误。在线程0x1bb8上,错误的地址为0x543c3dc8。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。
在DEBUG中运行测试会导致调试器请求以下文件。
X:\统一\ SRC \ ObjectBuilder的\策略\的buildPlan \ DynamicMethod的\ DynamicMethodBuildPlan.cs
它在第38行显示以下ExecutionEngineException。
System.ExecutionEngineException未处理 Message =“抛出类型'System.ExecutionEngineException'的异常。” 的InnerException:
测试
[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);
}
}
答案 0 :(得分: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中试过这个)
答案 1 :(得分:0)
我发布了this issue on the Unity CodePlex site。已经回答了。
在当前位中,您将获得正确的“InvalidOperationException”。 TimeSpan有多个构造函数,默认情况下它会选择四个参数,然后不知道要提供哪些内联。结构实际上没有零参数构造函数,clr“欺骗”引擎盖。
解决方法是告诉Unity使用哪个构造函数。
container.Register<TimeSpan>(new ExternallyControlledLifetimeManager(),
new InjectionConstructor(0L));