在 Visual Studio 单元测试中使用CallContext 导致的 Unit Test Adapter threw exception: Type is not resolved for member... 异常

该问题的表现形式是:

  在运行单元测试(或其他的VS测试类型)的时候 抛出异常  Unit Test Adapter threw exception: Type is not resolved for member... 

  但是同样的测试在应用程序/网站中都没有问题


该问题的根本原因是:

Visual Studio运行测试代码的时候实际上是在一个独立的AppDomain中运行的,该AppDomain 无法找到CallContext中存储的类型

所以抛出了这个异常,不过这个异常信息非常不清晰,只看异常信息很难找到问题原因


目前为止有3个解决方案:

  1.拷贝DLL到QAAgent32.exe所在的目录 (一般在visual studio安装目录里面,一般是C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE)

    该方案对DLL没有特殊要求,就是麻烦了点

    可以通过在Build Event中的 Post-build event command line 里面增加一个自动的copy命令 来简化手动操作

    同时由于QAAgent32.exe会一直保持运行,会导致文件被锁定无法自动覆盖,所以要设置Tools->Options->Test Tools->Test Excetion -> 取消 keep test exection engine running between test runs 的勾

  2.修改QAAgent32.exe.config 中的AssemblyRedirect 重新绑定一个路径

  3.将程序集注册到GAC (强烈推荐)

    将程序集注册到GAC的好处不仅仅是本地可以运行,当使用TFS Build来运行自动化测试的时候,在其他机器上也可以运行测试,而不需要再次配置

    此外将程序集做成强名称还有很多其他的好处,(大家可以自己google下~~~)

  可以在Build成功以后自动将生成的程序集注册到GAC

  配置步骤如下:

    1.添加GACUtil.exe到项目文件中 (有很多个版本的GACUtil.exe 高版本兼容低版本)

    2.右击GACUtil.exe -> 属性 -> Copy To Output Directory  设置为Copy if newer (并且保持Build Action 为默认值 Content)

    3.右击项目属性->Build Event ->Post-build event command line  添加如下代码

      

        "$(TargetDir)gacutil" -u "$(TargetName)"

        "$(TargetDir)gacutil" -i "$(TargetPath)"

        @echo add assembly to GAC $(TargetPath)

      以上代码的大意就是,先从GAC中移除同名的DLL,然后再注册进去,然后打印一些信息出来


PS:好吧。。其实还有一个办法是增加一个Attribute

[DeploymentItem("Arch.Base.Logging.API.dll")]

到特定的方法上


posted on   听说读写  阅读(1750)  评论(1编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!

导航

< 2012年3月 >
26 27 28 29 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7
点击右上角即可分享
微信分享提示