Unity: фатальная ошибка механизма выполнения при разрешении TimeSpan - PullRequest
0 голосов
/ 04 декабря 2009

Я пытаюсь разрешить TimeSpan , используя Unity . Выполнение вызова контейнера Resolve приводит к FatalExecutionEngineError .

Обнаружена FatalExecutionEngineError Сообщение: во время выполнения произошла неустранимая ошибка. Адрес ошибки был 0x543c3dc8, в потоке 0x1bb8. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек.

Запуск теста в DEBUG приводит к тому, что отладчик запрашивает следующий файл.

X: \ Unity \ Src \ ObjectBuilder \ Стратегии \ BuildPlan \ DynamicMethod \ DynamicMethodBuildPlan.cs

И это показывает следующее ExecutionEngineException в строке 38.

Исключение System.ExecutionEngineException было обработано Сообщение = "Исключение типа '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);
    }
}

Ответы [ 2 ]

2 голосов
/ 04 декабря 2009

Я не уверен, почему вы получаете сообщение об ошибке, но я попытался заменить тип конфигурации (в файле конфигурации, который вы отредактировали) следующим образом:

<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)

0 голосов
/ 07 января 2010

Ошибка механизма фатального выполнения при разрешении TimeSpan

Я разместил эту проблему на сайте Unity CodePlex . Был дан ответ.

В текущих битах вы получаете правильное «InvalidOperationException» . TimeSpan имеет несколько конструкторов, и по умолчанию он выбирает аргумент с четырьмя аргументами, а затем не знает, какие целые числа предоставить. Структуры на самом деле не имеют конструктора с нулевым аргументом, clr "читы" под капотом.

Решение - сообщить Unity, какой конструктор использовать.

container.Register<TimeSpan>(new ExternallyControlledLifetimeManager(), 
    new InjectionConstructor(0L));
...