Tag: clr

Browser.ReadyState上的致命执行错误

可能重复: .NET“致命执行引擎错误”故障排除 我的代码抛出致命执行错误。 确切的错误是这样的: 运行时遇到了致命错误。 错误的地址位于线程0x2044处的0xed40646c处。 错误代码是0xc0000005。 此错误可能是CLR中的错误,也可能是用户代码的不安全或不可validation部分中的错误。 此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。 据我所知,我没有使用不安全的用户代码。 导致问题的代码是这样的: WebClient client = new WebClient(); string pageHtml = client.DownloadString(url); browser.ScriptErrorsSuppressed = true; browser.DocumentText = pageHtml; do { Application.DoEvents(); } while (browser.ReadyState != WebBrowserReadyState.Complete); //CRASH OCCURS HERE 现在这里是踢球者。 此代码在循环上运行。 它经常发生这种错误。 有时它在第1000次运行。 上次是第5545次。 它似乎非常随机。 我该如何解决这个问题? 或者我如何获得更多信息来解决它?

什么是运行时主机?

运行时主机的确切定义是什么? 来自MSDN : 公共语言运行库旨在支持各种不同类型的应用程序,从Web服务器应用程序到具有传统丰富Windows用户界面的应用程序。 每种类型的应用程序都需要运行时主机来启动它。 运行时主机将运行时加载到进程中,在进程内创建应用程序域,并将用户代码加载到应用程序域中。 那么它是一个将运行时加载到另一个进程的进程吗? 如何在任务管理器中检查它?

防止Thread.CurrentPrincipal跨应用程序域传播

有没有人可以阻止当前线程的IPrincipal在应用程序域边界上传播? 我无法控制分配给该线程的IPrincipal,但我确实可以控制创建应用程序域。 (我想这样做的原因是为了防止在主体对象类型的程序集在另一个域中不可用时发生序列化错误。) 编辑: ExecutionContext.SuppressFlow看起来很有希望,但它似乎没有实现目标。 以下打印“MyIdentity”: static void Main () { ExecutionContext.SuppressFlow (); Thread.CurrentPrincipal = new GenericPrincipal (new GenericIdentity (“MyIdentity”), “Role”.Split ()); AppDomain.CreateDomain (“New domain”).DoCallBack (Isolated); } static void Isolated () { Console.WriteLine (“Current principal: ” + Thread.CurrentPrincipal.Identity.Name); // MyIdentity }

使用reflection覆盖C#中的虚方法表

有没有办法在C#中更改虚方法表? 喜欢改变虚拟方法指向的位置? class A { public virtual void B() { Console.WriteLine(“B”); } } class Program { public static void MyB(A a) { Console.WriteLine(“MyB”); } public static void Main(string[] Args) { A a = new A(); // Do some reflection voodoo to change the virtual methods table here to make B point to MyB aB(); // […]

在未经调试的情况下捕获托管代码中的第一次机会exception

有没有办法捕获First-Chanceexception,并记录它们而不在调试器下运行? 我想另一种提出这个问题的方法是,我可以编写一些东西,它会像调试器一样附加到我的进程中,看看它发生了什么问题吗?

防止非托管函数指针垃圾回收

将代理转换为非托管代码的文档说明我自己负责阻止代理收集。 我想知道在非管理呼叫是否有效的情况下是否无法收集代表。 例如,如果我这样做 UnmanagedFunction(arg => somebody); 其中UnmanagedFunction不存储超出其调用的函数指针。 这应该是合法的,对吧? 在UnmanagedFunction正在执行时,CLR无法收集。

.NET CLR InternalCall

有没有办法托管.NET CLR运行时并注册MethodImplOptions.InternalCall函数? (这不是关于P / Invoke的话题)

当作为具有接口约束的通用参数传递时,值类型是否装箱?

(作为回答这个问题的研究结果,我(我想我有!)确定答案是“不”。但是,我不得不在几个不同的地方找出来解决这个问题,所以我认为还有如果社区投票结束,我不会感到沮丧。) 例如: void f(T val) where T : IComparable { val.CompareTo(null); } void g() { f(4); } 4盒装? 我知道显式地将值类型转换为它实现触发装箱的接口: ((IComparable)4).CompareTo(null); // The Int32 “4” is boxed 我不知道的是,将值类型作为具有接口约束的generics参数传递是否等于执行强制转换 – 语言“其中T是IC可压缩”类型建议转换,但只是将T转换为IComparable似乎它会破坏通用的全部目的! 为了澄清,我想确保在上面的代码中没有发生这些事情: 当g调用f(4) , 4被IComparable为IComparable因为f的参数类型存在IComparable约束。 假设(1)没有发生,在f内, val.CompareTo(null)不会将val从Int32为IComparable以调用CompareTo 。 但我想了解一般情况; 不仅仅是int和IComparable发生了什么。 现在,如果我将以下代码放入LinqPad: void Main() { ((IComparable)4).CompareTo(null); f(4); } void f(T val) where T : IComparable { val.CompareTo(null); } […]

Windows窗体作为非托管应用程序的子窗口

我正在寻找一种方法来嵌入用C#编写的Windows窗体应用程序在C ++窗口应用程序中。 本机应用程序主窗口细分为多个窗格。 C#app应该出现在其中一个窗格中,即C#组件的根窗口(最外面的窗体)必须是主应用程序的子窗口。 可以这样做吗? 如果是这样,怎么样? 一些额外的背景:据我所知,有两种方法可以解决这个问题。 首先,使用.net托管API(ICLRRuntimeHost等)在本机应用程序中托管CLR。 其次,通过将Windows窗体放在ActiveX控件中来托管CLR。 关于第一种方法,我设法启动CLR并加载C#程序集(主要归功于MattiasHögström )。 在我遇到障碍的地方是我看不出如何告诉我在CLR中运行的组件它需要是从C ++端传入的窗口的子代。 我还尝试了第二种方法(使用ActiveX并感谢Daniel Yanovsky )。 它几乎,但只是差不多,适合我的目的。 我可以让任意Windows窗体组件在本机应用程序的子窗格中运行。 但它们总是在主应用程序的主线程上运行。 这意味着他们使用主应用程序的Windows消息循环。 MSDN说这不会可靠地工作,因为标准的Windows消息循环不符合Windows窗体的要求(我想在这里发布到MSDN的链接,但已经用完了我的新用户双链接分配)。 根据MSDN,Internet Explorer和MFC应用程序的消息循环问题的例外情况。 我作为主机使用的本机应用程序绝对不是Internet Explorer。 此外,它使用由wxWidgets包装的Windows API,因此MFC不是(或至少不是受欢迎的)选项。 Microsoft提出的解决方案涉及让C#组件在自己的线程上运行自己的消息循环。 至少据我所知,这必然会导致回到上面提到的第一种方法。 所以我回到了让Windows窗体在传入的父窗口下工作的问题。 同样,我对任何澄清子窗口问题的输入感兴趣,与我在此处提到的方法无关。 但根据上下文,我可以将一般问题减少到两个具体问题(我只需要回答其中一个问题): 给定一个ActiveX控件中托管的Windows窗体,如何允许窗体在自己的线程上自己的消息循环中运行? 要么 鉴于在本机应用程序托管的CLR中运行的Windows窗体,如何使窗体成为本机应用程序中窗口的子窗口?

使用ClrMD加载转储文件时“加载DAC失败:CreateDacInstance失败”

我正在尝试使用来自microsoft的新库ClrMD来分析崩溃转储和实时进程。 我已经按照.NET框架博客文章 (使用附带的.cs文件 )中的示例进行操作 。 我试图运行样本来分析.dmp文件,该文件取自与样本在同一台机器上运行的程序。 尝试创建运行时对象时,使用以下代码: ClrRuntime runtime = target.CreateRuntime(dacLocation); 抛出此exception: 消息:加载DAC失败:CreateDacInstance失败0x80131c30 在Microsoft.Diagnostics.Runtime.Desktop.DacLibrary.Init(String dll) 在Microsoft.Diagnostics.Runtime.Desktop.DacLibrary..ctor(DbgEngTarget dataTarget,String dll) 在Microsoft.Diagnostics.Runtime.DbgEngTarget.CreateRuntime(String dacFilename) 在DumpFetch.App..ctor() 有任何想法吗?