作为将我的应用程序分段为单独的应用程序域以便在调用本机DLL时捕获并从间歇性崩溃中恢复的一部分,我需要一种可靠地触发此类崩溃的方法,以确定是否捕捉到应用程序域正在停止正确。非托管dll调用崩溃一个dotnet应用程序?
我正在寻找一些简单的本地代码(C++?)我可以编译成一个dll,并从我的dotnet代码中调用,期望它将使用它的dotnet代码。
有什么建议吗?
作为将我的应用程序分段为单独的应用程序域以便在调用本机DLL时捕获并从间歇性崩溃中恢复的一部分,我需要一种可靠地触发此类崩溃的方法,以确定是否捕捉到应用程序域正在停止正确。非托管dll调用崩溃一个dotnet应用程序?
我正在寻找一些简单的本地代码(C++?)我可以编译成一个dll,并从我的dotnet代码中调用,期望它将使用它的dotnet代码。
有什么建议吗?
只是做一个本地C++函数,它什么坏事,比如被零除,即:
void BeABadMethod()
{
int i = 5;
int j = 0;
printf("%d", i/j);
}
void CrashAndBurn (void)
{
*((int *)0) = 1337;
}
而不是写你自己的DLL,您可以从标准者之一,并导入做一些你知道会导致异常的东西。例如,调用GetProcAddress与hModule = 0
应该导致一个异常。它可能检查为0,因为0可以NULL
,但我真的怀疑它会检查其他小号码,如1或2 :)
如何根据pinvoke.net导入GetProcAddress的:
[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
public static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);
这程序:
using System.Runtime.InteropServices;
using System;
public class x
{
[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
public static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);
static void Main()
{
Console.WriteLine(GetProcAddress((IntPtr)5, "asdf"));
}
}
导致以下错误在单,监守我没有KERNEL32:
Unhandled Exception: System.EntryPointNotFoundException: GetProcAddress at (wrapper managed-to-native) x:GetProcAddress (intptr,string) at x.Main() [0x00000]
所以我不知道它会在Windows上的.NET中做什么 - 希望这会导致崩溃!
您可以创建一个本机DLL,以便在DLL尝试调用它之前对托管代码委托实例进行回调,该托管代码委托实例已超出范围。我不知道它在完整的.Net框架中会产生什么影响,但在.Net Compact Framework中,它使您的应用程序瞬间消失,完全无法解决。
这可能不是你正在寻找的,但另一方面它可能可能是正是你要找的,因为这是一个相当常见的间歇性错误的来源,当从管理调用本机DLL代码(更一般的情况是,当你传入的结构没有被合适的范围或未被“固定”的时候,这些类型的错误可能会发生,因此当本地DLL仍然与它们一起工作时,GC可能会丢弃或移动这些错误)。
Lotus笔记有API吗? ;) – 2009-09-24 00:23:55
你有没有尝试过一个基本的空指针去引用? – elcelista 2009-09-24 00:26:08