У меня есть 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 не было выбрано непосредственно.
Это совершенно слишком расплывчатым, как минимум, вы должны дать нам ** ** точное сообщение об исключении и трассировка стека. Написание обработчика событий для AppDomain.CurrentDomain.UnhandledException, поэтому вы получите лучшую диагностику, которая никогда не является обязательной. Спросите, кто написал DLL, чтобы помочь вам. –
Вы указали фактическую подпись своего родного метода? Является ли родной dll вашей собственной DLL, и вы могли бы поделиться источником или это сторонняя библиотека? Он также может помочь найти свойство ['ExternalException.ErrorCode'] (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.externalexception.errorcode.aspx). Btw, любая конкретная причина, по которой вы устанавливаете оболочку, выполняет true? Это, похоже, не нужно здесь. –
@DirkVollmar - код ошибки SEHException совпадает с кодом ExternalException.ErrorCode. ShellExecute здесь не нужен, нет, вытаскивание не меняет поведения, хотя – binderbound