2016-07-15 9 views
4

У меня есть 32-битная dll, которую мне нужно вызывать из 64-разрядного приложения .NET Core.C# dllimport бросает SEHException при вызове Process.Start

Мой способ сделать это, чтобы создать 32-битную консоль App, которая в основном выглядит следующим образом:

[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. 
} 

А потом звонить, что с моим 64 разрядным процессорным ядром Применения с использованием Process.Start("consoleapp.exe")

Когда я бегу Файл consoleapp.exe, он печатает "I Started!" как и ожидалось, и работа x.dll также выполняется правильно.

Однако, когда я вызываю consoleapp.exe из process.Start(), я получаю исключение SEHException после «I Started!». печатается на выходе (т. е. когда удаляется часть 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 "Не выбрано Failure"


UPDATE: В соответствии с просьбой, стек трассировки:

at Consoleapp.Consoleapp.x(int32 var) 
    at Consoleapp.Consoleapp.Main(String[] args) 

Не уверен, как это поможет вам. Если вы имеете в виду трассировку стека внешнего исключения, я не могу решить, как получить доступ к этому (InnerException - null). Какой-то справочник может помочь мне в этом.

Сообщение, прикрепленное к исключению, является «Внешний компонент выбрал исключение».

Файл x.dll считывает файл в подкаталоге под CSIDL_COMMON_APPDATA. Эта переменная правильная, когда я запускаю программу напрямую, а из веб-приложения - используется console.log на Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)) Содержимое файла считывается, чтобы получить местоположение базы данных и учетные данные для чтения из конкретной базы данных. Если какая-либо часть этого не сработала, x.dll возвращает код ошибки, а не исключение, и я дважды проверил это, изменив учетные данные в файле, имени базы данных, номерах записей и т. Д., И при запуске SEHExceptions не было выбрано непосредственно.

+2

Это совершенно слишком расплывчатым, как минимум, вы должны дать нам ** ** точное сообщение об исключении и трассировка стека. Написание обработчика событий для AppDomain.CurrentDomain.UnhandledException, поэтому вы получите лучшую диагностику, которая никогда не является обязательной. Спросите, кто написал DLL, чтобы помочь вам. –

+0

Вы указали фактическую подпись своего родного метода? Является ли родной dll вашей собственной DLL, и вы могли бы поделиться источником или это сторонняя библиотека? Он также может помочь найти свойство ['ExternalException.ErrorCode'] (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.externalexception.errorcode.aspx). Btw, любая конкретная причина, по которой вы устанавливаете оболочку, выполняет true? Это, похоже, не нужно здесь. –

+0

@DirkVollmar - код ошибки SEHException совпадает с кодом ExternalException.ErrorCode. ShellExecute здесь не нужен, нет, вытаскивание не меняет поведения, хотя – binderbound

ответ

1

Сделать

public static extern x(int var); 

и/или попытаться определить его недействительным

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

Привет, Томас - я не задал в исходном вопросе, но тип возврата подписи - это int для DLL, и я намерен делать что-то с этим int позже – binderbound

+0

OK - неважно –

 Смежные вопросы

  • Нет связанных вопросов^_^