64 비트 .Net Core Application에서 호출해야하는 32 비트 DLL이 있습니다.Process.Start에 의해 호출 될 때 C# dllimport가 SEHException을 throw합니다.
는 이 작업을 수행하려면 내 방법은 기본적으로 다음과 같습니다 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를 호출하면 "시작한"후에 SEHException이 발생합니다. 는 출력에 인쇄됩니다 (즉, DllImport 부분이 히트 될 때). 나는 이미 사용자 가장을 시도 앱
ProcessStartInfo p = new ProcessStartInfo("consoleapp.exe");
Process process = Process.Start(p);
process.WaitForExit();
내 64 비트 내에서 프로세스를 시작하고 관리자 프로세스 개체를 실행하고 작동하지 않는거야 방법은 다음과
이다.
dll 파일 인 x.dll은 consoleapp.exe의 작업 디렉토리에 있습니다. 작업 디렉토리에서 console.writeline()을 수행하고 x.dll 파일의 위치가 일치합니다. 있습니다. 요청으로, 스택 추적은 다음과 같습니다 :
SEHException 오류 코드
UPDATE E_FAIL "지정되지 않은 오류"인 0X80004005입니다
at Consoleapp.Consoleapp.x(int32 var)
at Consoleapp.Consoleapp.Main(String[] args)
그것이 당신을 데 어떻게 도움이되는지 확실하지. 외부 예외의 스택 추적을 의미하는 경우 액세스 할 방법을 찾을 수 없습니다 (InnerException은 null 임) - 어떤 종류의 가이드가 도움이 될 수 있습니다.
예외에 첨부 된 메시지는 "외부 구성 요소에서 예외가 발생했습니다."입니다.
x.dll 파일은 CSIDL_COMMON_APPDATA 아래의 하위 디렉터리에있는 파일을 읽습니다. 이 변수는 프로그램을 직접 실행하거나 웹 응용 프로그램에서 사용하는 경우에 적합합니다 - console.log on Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData))
파일 내용은 특정 데이터베이스에서 읽을 데이터베이스 위치 및 자격 증명을 얻기 위해 읽습니다. 그 중 일부가 실패하면 x.dll은 예외가 아닌 오류 코드를 반환하고 파일, 데이터베이스 이름, 레코드 번호 등의 자격 증명을 변경하여이 경우를 다시 확인하고 실행할 때 SEHExceptions이 throw되지 않습니다 직접.
무효가와 스택 추적 AppDomain.CurrentDomain.UnhandledException에 대한 이벤트 처리기를 작성하면 더 나은 진단을 얻을 수 있습니다. DLL을 작성한 사람에게 도움을 요청하십시오. –
네이티브 메서드의 실제 서명을 표시 했습니까? 네이티브 dll이 자신의 dll이고 소스를 공유 할 수 있거나 제 3 자 라이브러리입니까? ['ExternalException.ErrorCode'] (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.externalexception.errorcode.aspx) 속성을 살펴 보는 것도 도움이 될 수 있습니다. Btw, 쉘을 설정하는 특별한 이유가 true로 실행됩니까? 여기서는 필요하지 않은 것 같습니다. –
@DirkVollmar - SEHException 오류 코드는 ExternalException.ErrorCode와 동일합니다. – binderbound