小编Yoa*_*any的帖子

尝试在新的AppDomain中加载混合的C#和C++/CLI dll时从错误的AppplicationBase加载的DLL

我们有一个大型的.NET解决方案,其中包含相互引用的C#和C++/CLI项目.我们还有几个单元测试项目.我们最近从Visual Studio 2010和.NET 4.0升级到Visual Studio 4.5和.NET 4.5,现在当我们尝试运行单元测试时,在测试期间加载某些DLL似乎存在问题.

问题似乎发生,因为单元测试是在单独的AppDomain上执行的.单元测试过程(例如nunit-agent.exe)创建一个新的AppDomain,AppBase设置为测试项目的位置,但是根据Fusion Log,一些DLL加载了nunit的可执行文件目录作为AppBase而不是AppDomain的AppBase .

我设法用一个更简单的场景重现问题,它创建了一个新的AppDomain并尝试在那里运行测试.这是它的外观(我更改了单元测试类的名称,方法和dll的位置以保护无辜者):

class Program
{
    static void Main(string[] args)
    {

        var setup = new AppDomainSetup {
            ApplicationBase = "C:\\DirectoryOfMyUnitTestDll\\"
        };

        AppDomain domain = AppDomain.CreateDomain("MyDomain", null, setup);
        ObjectHandle handle = Activator.CreateInstanceFrom(domain, typeof(TestRunner).Assembly.CodeBase, typeof(TestRunner).FullName);
        TestRunner runner = (TestRunner)handle.Unwrap();
        runner.Run();

        AppDomain.Unload(domain);
    }

}

public class TestRunner : MarshalByRefObject
{
    public void Run()
    {
        try
        {
            HtmlTransformerUnitTest test = new HtmlTransformerUnitTest();
            test.SetUp();
            test.Transform_HttpEquiv_Refresh_Timeout();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试执行单元测试时遇到的异常.正如您所看到的,问题发生在C++ dll初始化并尝试加载C#dll(我将所涉及的DLL的名称更改为CPlusPlusDll和CSharpDll):

System.TypeInitializationException: …

c# unit-testing c++-cli appdomain .net-4.5

17
推荐指数
1
解决办法
3143
查看次数

标签 统计

.net-4.5 ×1

appdomain ×1

c# ×1

c++-cli ×1

unit-testing ×1