Сборка смешанного режима MSTest Failing в VS2015

При попытке запустить модульные тесты, использующие сборки смешанного режима в VS2015, тесты не выполняются с обычным сообщением:

System.IO.FileLoadException: сборка смешанного режима построена для версии "v2.0.50727" среды выполнения и не может быть загружена в среде выполнения 4.0 без дополнительной информации о конфигурации.

Создание app.config и добавление useLegacyV2RuntimeActivationPolicy на это не имеет никакого эффекта - кажется, что эту конфигурацию невозможно изменить.

Ранее это работало без ручных шагов в VS2013.

1 ответ

Решение

Альтернатива 1: конфигурация

Добавьте конфигурацию запуска в C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\TE.ProcessHost.Managed.exe.config:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

Альтернатива 2: во время выполнения

Это может перестать работать.

Просто добавьте этот класс в проект модульного теста ( источник):

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public static class RuntimePolicyHelper
{
    [AssemblyInitialize]
    public static void SetPolicy(TestContext ctx)
    {
        var clrRuntimeInfo =
            (ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject(
                Guid.Empty,
                typeof(ICLRRuntimeInfo).GUID);

        // Allow errors to propagate so as to fail the tests.
        clrRuntimeInfo.BindAsLegacyV2Runtime();
    }

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")]
    private interface ICLRRuntimeInfo
    {
        void xGetVersionString();
        void xGetRuntimeDirectory();
        void xIsLoaded();
        void xIsLoadable();
        void xLoadErrorString();
        void xLoadLibrary();
        void xGetProcAddress();
        void xGetInterface();
        void xSetDefaultStartupFlags();
        void xGetDefaultStartupFlags();

        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void BindAsLegacyV2Runtime();
    }
}
Другие вопросы по тегам