- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用 ReSharper (8.2.2) 和 VS 2013 运行我的测试用例时遇到了一个奇怪的错误。
演示该问题的简化测试用例仅包含两行代码:
CallContext.LogicalSetData("mydata", new ActivityStack());
var evidence = AppDomain.CurrentDomain.Evidence;
其中 ActivityStack 是可序列化的自定义类型。当通过 ReSharper 运行测试用例时,第二行会抛出异常:
System.Runtime.Serialization.SerializationException was unhandled by user code
HResult=-2146233076
Message=Type is not resolved for member 'CSG.Framework.Operations.ActivityStack,CSG.Framework, Version=15.2.0.0, Culture=neutral, PublicKeyToken=e7ab1d859f54b223'.
Source=mscorlib
StackTrace:
at System.AppDomain.get_Evidence()
at System.AppDomain.get_Evidence()
at CSG.Framework.Utilities.AppDomainLauncher`1..ctor(String appDomainName) in d:\Work\Git\Framework\Src\Library\Framework\Utilities\AppDomainLauncher.cs:line 40
at CSG.Framework.UnitTest.AppDomainLauncherTests.LaunchClassFromCallingAssembly() in d:\Work\Git\Framework\Src\Library\Framework.UnitTest\Utilities\AppDomainLauncherTests.cs:line 52
InnerException:
即使当前 AppDomain 似乎在 BaseDirectory 上具有正确的路径,可以在其中找到包含该类型的程序集,但根据 Fusion 日志,CLR 似乎仍在使用 ReSharper bin 路径来探测程序集。如果我将程序集复制到 ReSharper bin 文件夹,问题就会消失,但我认为这不是正确的解决方案。我尝试订阅当前 AppDomain 上的 AssemblyResolve 事件,但未调用处理程序。
融合日志:
*** Assembly Binder Log Entry (1/23/2015 @ 12:28:54 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\Program Files (x86)\JetBrains\ReSharper\v8.2.Qiwabic\Bin\JetBrains.ReSharper.TaskRunner.CLR45.x64.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = CSG.Framework, Version=15.2.0.0, Culture=neutral, PublicKeyToken=e7ab1d859f54b223 (Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = JetBrains.ReSharper.TaskRunner.CLR45.x64.exe Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files (x86)\JetBrains\ReSharper\v8.2.Qiwabic\Bin\JetBrains.ReSharper.TaskRunner.CLR45.x64.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: CSG.Framework, Version=15.2.0.0, Culture=neutral, PublicKeyToken=e7ab1d859f54b223
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework/CSG.Framework.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework.EXE.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework/CSG.Framework.EXE.
LOG: All probing URLs attempted and failed.
最佳答案
此链接 ( https://msdn.microsoft.com/en-us/library/dn458353(v=vs.110).aspx ) 解释了根本原因。
涉及两个应用程序域:默认应用程序域(ReSharper 运行器)和当前应用程序域(测试用例)。 AppDomain.Evidence 在当前应用域中执行时:
由于逻辑调用上下文中的类型(ActivityStack)无法在默认应用域中解析,因此抛出异常。
关于c# - AppDomain.CurrentDomain.Evidence 抛出 SerializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28116552/
所以我的问题围绕着节省内存。 本质上,我需要将程序集加载到主域/当前域以外的单独应用程序域中,检查该程序集中的类型,然后在完成后卸载新域。 目前我的解决方案如下: AppDomain NewDomai
我想枚举 Asp.NET 应用程序中所有加载的程序集,使用 AppDomain.CurrentDomain.GetAssemblies() .但是,在检查 AppDomain 的文档时,我发现以下语句
当我需要在关闭应用程序之前使用 Stop() 函数停止后台线程时,我有一个简单的应用程序。问题是我的 Main() 函数有几个退出点(返回语句) static void Main(string[] a
我有一个带有绑定(bind)到 Application.CurrentDomain.UnhandledException 的事件处理程序的 .NET 程序。 运行带有调试的程序时,当抛出未处理的异常时
我有一个全局异常处理程序,可以在Main.cs中很好地工作,但是在捕获到错误后,我的应用程序不存在了,而只是挂起了。我尝试了Environment.Exit,退出选择器,返回,重新抛出异常-所有这些仍
我目前正在使用以下代码: AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var name = args.Name
我想在发生未处理的异常时在问题跟踪器系统中创建错误报告。由于这是通过一系列异步http请求完成的,所以对应的方法是async return a task: AppDomain.CurrentDomai
我在单独的类库项目中有电子邮件模板(和电子邮件发送器)。我正在获取 View 路径(复制到输出目录 = true),如下所示: var basePath = AppDomain.CurrentDoma
在 VS2012 中,我有一堆 (MS) 单元测试,它们使用我存储在与测试文件类相同的文件夹中的不同 xml/文本文件。 我使用 File.OpenRead(AppDomain.CurrentDoma
我有一个程序集,当访问它时,它会启动一个线程来处理放置在队列中的项目。在该程序集中,我将一个处理程序附加到 DomainUnload 事件: AppDomain.CurrentDomain.Domai
我想遍历我在项目中添加的所有类 Assembly[] foo = AppDomain.CurrentDomain.GetAssemblies(); foreach(Assembly a in foo)
我有一个 WCF 服务,在 Global.asax 中有以下代码: protected void Application_Start(object sender, EventArgs e) {
我正在尝试使用 CurrentDomain.AssemblyResolve 事件来加载标记为嵌入式资源的 DLL。具体来说,我的问题来自于我试图将程序集用作子类的事实,如下所示: #define BR
我试图根据答案实现解决方案 How to handle exceptions raised in other threads when unit testing? ,但我仍然不明白在处理程序中做什么。
我已经设置了 UnhandledException 以在我的服务崩溃之前记录任何异常。 AppDomain.CurrentDomain.UnhandledException += new Unhand
在找到关于程序集解析 (AppDomain.CurrentDomain.AssemblyResolve asking for a .resources assembly?) 的最后一个问题的答案后,我
如何将 AppDomain.CurrentDomain.BaseDirectory 的相对路径获取到 Uri 中。 我需要从 AppDomain.CurrentDomain.BaseDirectory
总的来说,我试图从主域中的 dll 执行方法,但之后,卸载该 dll。到目前为止,我已经创建了新的 AppDomain 并在那里加载了 Assembly\dll,使用 MarshalByRefObje
我遇到了一个问题,我的单元测试没有在我的 TFS 构建机器上运行,尽管它们正在我的开发人员机器上运行。 我在以下行中遇到异常,试图为特定接口(interface)加载所有加载的程序集: var
我在使用 ReSharper (8.2.2) 和 VS 2013 运行我的测试用例时遇到了一个奇怪的错误。 演示该问题的简化测试用例仅包含两行代码: CallContext.LogicalSetDat
我是一名优秀的程序员,十分优秀!