2016-07-15 2 views
4

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되지 않습니다 직접.

+2

무효가와 스택 추적 AppDomain.CurrentDomain.UnhandledException에 대한 이벤트 처리기를 작성하면 더 나은 진단을 얻을 수 있습니다. DLL을 작성한 사람에게 도움을 요청하십시오. –

+0

네이티브 메서드의 실제 서명을 표시 했습니까? 네이티브 dll이 자신의 dll이고 소스를 공유 할 수 있거나 제 3 자 라이브러리입니까? ['ExternalException.ErrorCode'] (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.externalexception.errorcode.aspx) 속성을 살펴 보는 것도 도움이 될 수 있습니다. Btw, 쉘을 설정하는 특별한 이유가 true로 실행됩니까? 여기서는 필요하지 않은 것 같습니다. –

+0

@DirkVollmar - SEHException 오류 코드는 ExternalException.ErrorCode와 동일합니다. – binderbound

답변

1

확인이

public static extern x(int var); 

및/또는 지정하려고 당신이 우리에게 ** 정확한 ** 예외 메시지를 제공해야 최소한 완전히 너무 애매한

public static extern void x(int var); 
+0

안녕 토마스 - 나 원래의 질문에서는 지정하지 않았지만 서명 반환 유형은 DLL에 대한 int이며 나중에 해당 int를 사용하여 작업하려고합니다. – binderbound

+0

OK - 신경 쓰지 마라. –

관련 문제