2009-09-24 84 views
1

作为将我的应用程序分段为单独的应用程序域以便在调用本机DLL时捕获并从间歇性崩溃中恢复的一部分,我需要一种可靠地触发此类崩溃的方法,以确定是否捕捉到应用程序域正在停止正确。非托管dll调用崩溃一个dotnet应用程序?

我正在寻找一些简单的本地代码(C++?)我可以编译成一个dll,并从我的dotnet代码中调用,期望它将使用它的dotnet代码。

有什么建议吗?

+2

Lotus笔记有API吗? ;) – 2009-09-24 00:23:55

+0

你有没有尝试过一个基本的空指针去引用? – elcelista 2009-09-24 00:26:08

回答

0

只是做一个本地C++函数,它什么坏事,比如被零除,即:

void BeABadMethod() 
{ 
    int i = 5; 
    int j = 0; 
    printf("%d", i/j); 
} 
0
void CrashAndBurn (void) 
{ 
    *((int *)0) = 1337; 
} 
1

而不是写你自己的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中做什么 - 希望这会导致崩溃!

0

您可以创建一个本机DLL,以便在DLL尝试调用它之前对托管代码委托实例进行回调,该托管代码委托实例已超出范围。我不知道它在完整的.Net框架中会产生什么影响,但在.Net Compact Framework中,它使您的应用程序瞬间消失,完全无法解决。

这可能不是你正在寻找的,但另一方面它可能可能是正是你要找的,因为这是一个相当常见的间歇性错误的来源,当从管理调用本机DLL代码(更一般的情况是,当你传入的结构没有被合适的范围或未被“固定”的时候,这些类型的错误可能会发生,因此当本地DLL仍然与它们一起工作时,GC可能会丢弃或移动这些错误)。

相关问题