2012-10-11 48 views
1

我有一個使用ICorDebug::CreateProcesshttp://msdn.microsoft.com/en-us/library/vstudio/ms232508.aspx).Net 4.5的程序。它可以在Windows XP,Vista,7上運行,但不能在Windows 8上運行:即使在調試模式下,我的程序也不會停止任何消息。但是,.Net 4.0中的相同程序在Windows 8上正常工作。在.Net 4.5中的Windows 8上ICorDebug :: CreateProcess崩潰?

對此有何想法?

預先感謝:)

+1

「我的程序在沒有任何消息的情況下停止,即使在調試模式下」是什麼意思?當你在調試器中瀏覽你的程序時,會發生什麼?什麼'CreateProcess'返回?你將不得不提供一個最小的repro - 一個演示問題的例子。 –

+0

我的程序停止運行並關閉,沒有拋出任何異常。當我遍歷我的程序時,到達執行此函數,調試程序停止,就像我選擇停止它一樣,而不攔截程序中的任何錯誤。所以,CreateProcess不會執行(無論如何都不正確),所以不會返回任何內容。 –

+0

您是否有第一次機會異常處理功能?你是否已經通過程序集查看當進程意外終止時正在執行的內容? –

回答

2

我不知道這是否會在診斷這個問題還是沒有幫助,但我有在Windows 8類似的事情發生爲好。

我們有一些,我們正在嘗試測試在Win 8

幾個應用程序的遺留應用程序VB6運行使用CreateProcessA其他VB6應用。一些帶有和沒有參數 - 通常命令行parm指向在%temp%中創建的參數文件。

其中大部分運行得很好。但是,其中一些將不會運行。 CreateProcessA返回一個零。

但是,如果我檢查VB中的err.LastDLLError,它會返回740意味着「進程需要提升」。

如果我使用ShellExecute,它工作正常 - 並且UAC不要求提升!

我不明白爲什麼這幾個程序的行爲就像這樣,因爲,正如我所提到的,我覺得其他程序也同樣複雜,可以在CreateProcessA下正常運行。

順便說一句 - 這些程序在UAC開啓或關閉的XP,Vista和Win 7下運行完美。其中任何一個都不需要提升。

但是 - 底線是ShellExecute似乎運行良好,所以我會建議海報嘗試它而不是CreateProcess。

+0

嗨, 謝謝你的迴應:) 我會試試看它是否運行。我會告訴你的。 再次感謝您 –

0

謝謝大家的幫助。問題解決了:ICorDebug中的CreateProcess函數的參數及其衍生產品存在問題。 只是爲了測試,如果我可以有比用戶1748224相同的問題,我已經改變了我的清單:如果我的項目沒有管理員權限我有相同的消息比你,user1748224。我不知道VB6是如何工作的,但在.Net中,爲了避免這個問題,我們只需要改變主應用程序的清單。

再次感謝:)

1

作爲承諾我張貼在私人電子郵件響應艾蒂安(感謝艾蒂安提供的攝製信息)

我相信你是在64位Windows 8運行框中並且默認情況下,除非特別指定,否則Visual Studio將構建並運行受管進程作爲64位進程。構建和運行x86平臺的示例不會導致無提示崩潰,而是會拋出一個包含錯誤的對話框。

在__CreateProcess定義中,您使用uint作爲參數類型。以64位進程運行時,地址字段爲64位,使用uint時會被截斷。這會導致訪問衝突和應用程序失敗。你應該使用IntPtr,它應該兼顧兩者的兼容性。

[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] 
void __CreateProcess(
    [In, MarshalAs(UnmanagedType.LPWStr)] string lpApplicationName, 
    [In, MarshalAs(UnmanagedType.LPWStr)] string lpCommandLine, 
    [In] ref _SECURITY_ATTRIBUTES lpProcessAttributes, 
    [In] ref _SECURITY_ATTRIBUTES lpThreadAttributes, 
    [In] int bInheritHandles, [In] uint dwCreationFlags, 
    [In] IntPtr lpEnvironment, 
    [In, MarshalAs(UnmanagedType.LPWStr)] string lpCurrentDirectory, 
    [In, ComAliasName("Debugger.Interop.CorDebug.ULONG_PTR")] uint lpStartupInfo, 
    [In, ComAliasName("Debugger.Interop.CorDebug.ULONG_PTR")] uint lpProcessInformation, 
    [In] CorDebugCreateProcessFlags debuggingFlags, 
    [MarshalAs(UnmanagedType.Interface)] out ICorDebugProcess ppProcess); 

另外,API CreateDebuggingInterfaceFromVersion是過時的,你想使用ICLRRuntimeInfo :: GetInterface創建ICorDebug接口。您可以參考CLR Managed Debugger Sample獲取代碼示例。

請讓我們知道如果這不能解決您的問題。

結論:這是與.NET4或.NET4.5無關的內存損壞。失敗是隨機的。由於內存損壞,您的應用程序可能隨機在.NET4上失敗,這恰好是您在.NET4.5中看到失敗的原因。

相關問題