我有一個32位dll,需要從64位.NET核心應用程序調用。C#dllimport當由Process.Start調用時拋出SEHException
我的方法做,這是創建一個32位控制檯應用程序,基本上是這樣的:
[DllImport("x.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int x(int var);
static void Main(string[] args)
{
Console.log("I Started!");
int y = x(0);
//do something with y.
}
然後調用從使用Process.Start("consoleapp.exe")
當我運行我的64位核心應用consoleapp.exe文件,它打印「我開始了!」如預期的那樣,並且x.dll的運行也正確執行。
但是,當我從process.Start()調用consoleapp.exe時,我在「I Started!」之後拋出了SEHException!被打印到輸出(即,當DllImport部分被擊中時)。
這裏是我我開始了我的過程中的64位應用程序
ProcessStartInfo p = new ProcessStartInfo("consoleapp.exe");
Process process = Process.Start(p);
process.WaitForExit();
我已經嘗試用戶模擬和運行過程對象作爲管理員,並且它不工作。
該dll文件,x.dll肯定是在consoleapp.exe的工作目錄中,因爲我已經使該進程在工作目錄上執行了console.writeline(),並且它匹配了x.dll文件所在的位置位於。
的SEHException錯誤代碼爲0x80004005的,這是E_FAIL 「未指定失敗」
更新:根據要求,堆棧跟蹤是:
at Consoleapp.Consoleapp.x(int32 var)
at Consoleapp.Consoleapp.Main(String[] args)
不知道如何幫助你。如果你的意思是外部異常的堆棧跟蹤,我不能解決如何訪問(InnerException爲空) - 某種類型的指南可能會幫助我做到這一點。
附加到異常的消息是「外部組件已引發異常。」
x.dll文件讀取CSIDL_COMMON_APPDATA下的子目錄中的文件。當我直接運行程序時,這個變量是正確的,並從web應用程序 - 使用console.log Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData))
讀取文件內容以獲取數據庫位置和憑證以從特定數據庫中讀取。如果任何一部分失敗,x.dll將返回一個錯誤代碼,而不是一個例外,並且我已經通過更改文件,數據庫名稱,記錄號碼等憑據進行了雙重檢查,並且在運行時沒有引發SEHExceptions直。
這完全是過於模糊,至少你得給我們** **確切異常消息和堆棧跟蹤爲AppDomain.CurrentDomain.UnhandledException編寫事件處理程序,以便您獲得更好的診斷不會是可選的。詢問誰寫了DLL來幫助你。 –
您是否顯示您的本地方法的實際簽名?是本機DLL你自己的DLL,你可以共享源代碼或是第三方庫? 它也可能有助於查看['ExternalException.ErrorCode'](https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.externalexception.errorcode.aspx)屬性。 順便說一句,你設置shell執行爲true的任何特定原因?這似乎並不需要。 –
@DirkVollmar - SEHException錯誤代碼與ExternalException.ErrorCode相同。 ShellExecute在這裏是不需要的,不,取出不會改變行爲,儘管 – binderbound