-1

我在.NET中有这段代码:

 result = NativeMethods.gsapi_init_with_args(_ghostScriptInstance, args.Length, _argumentPointersHandle.AddrOfPinnedObject());

依次执行此代码

[DllImport("C:\\gsdll64.dll", EntryPoint = "gsapi_init_with_args")]
public static extern int gsapi_init_with_args(IntPtr instance, int argc, IntPtr argv);

问题是由于未知的问题,本机执行进入无限循环并且永远不会返回。

问题是我怎样才能限制这个原生事物的执行时间。我可以以某种方式告诉.NET,如果NativeMethods.gsapi_init_with_args在一分钟内没有返回然后终止本机执行并返回吗?

4

1 回答 1

0

可能在新线程中调用该方法并在调用未及时完成时终止该线程。杀死线程是不好的,但在这种特殊情况下,我假设您无权访问本机函数的源代码。

不知何故 Thread.Abort 不起作用(将尝试弄清楚互操作线程的工作原理),而不是创建托管线程,您可以使用 CreateThread 创建本机线程并在超时后终止它。

[DllImport("Library.dll")]
public static extern void InfiniteLoop();

[DllImport("kernel32")]
private static extern int CreateThread(
   IntPtr lpThreadAttributes,
   UInt32 dwStackSize,
   IntPtr lpStartAddress,
   IntPtr param,
   UInt32 dwCreationFlags,
   UInt32 lpThreadId
 );

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int TerminateThread(int hThread);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetLastError();

private delegate int InvokeInfiniteLoop(IntPtr args);

static void Main(string[] args)
{
      InvokeInfiniteLoop invokeInfiniteLoop = (args1) =>
                                                    {
                                                        InfiniteLoop();
                                                        return 0;
                                                    };
     IntPtr infiniteLoopPtr = Marshal.GetFunctionPointerForDelegate(invokeInfiniteLoop);
     int handle = CreateThread(IntPtr.Zero, 0, infiniteLoopPtr, IntPtr.Zero, 0, 0);
     Thread.Sleep(TimeSpan.FromSeconds(5));
     int terminated = TerminateThread(handle);
     Console.WriteLine(terminated);
}

请注意,终止线程很危险,您可以在此处阅读所有相关信息:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686717 (v=vs.85).aspx 。HansPassant 是对的,如果源代码可用,您可以调试它并找出错误。

于 2012-08-18T23:38:06.587 回答