Не удалось загрузить файл или сборку «protobuf-net», если я запускаю .NET-процесс через CreateProcess () - PullRequest
1 голос
/ 21 апреля 2011

Я создал приложение .NET в C #, и оно прекрасно работает, когда я запускаю его из окна консоли cmd, но если я попытался запустить приложение из своего собственного приложения, написанного на C ++, с помощью вызова CreateProcess (), я получаю исключение как следующим образом.

Unhandled Exception: System.TypeInitializationException: The type initializer for
'AppLog_NS.LogReader' threw an exception. ---> System.IO.FileNotFoundException: 
Could not load file or assembly 'protobuf-net, Version=1.0.0.280, Culture=neutral, 
ublicKeyToken=257b51d87d2e4d67' or one of its dependencies. The system cannot 
find the file specified.File name: 'protobuf-net, Version=1.0.0.280, 
Culture=neutral, PublicKeyToken=257b51d87d2e4d67' at AppLog_NS.LogReader..cctor()

Вот как я вызываю CreateProcess ().

GetSecurityInfo(GetCurrentProcess(), SE_KERNEL_OBJECT, 0, 0, 0, 0, 0, &sd);
saAttr.nLength = sizeof(saAttr);
saAttr.bInheritHandle = FALSE;
saAttr.lpSecurityDescriptor = sd;

memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
memset(&pi, 0, sizeof(PROCESS_INFORMATION));

// Launch bootstrapper
CreateProcess(NULL, cmd_path,  &saAttr, NULL, FALSE, 0, NULL, NULL, &si, &pi);

FYI, созданный мной родительский процесс и приложение .NET находятся в одном и том же каталоге, и в этом же каталоге у меня есть protobuf-net.dll. В противном случае он не смог бы запуститься должным образом из окна cmd.

protobuf-net.dll отсутствует в GAC, и я предполагаю, что, пока он находится в одном и том же каталоге, он должен быть в состоянии найти dll и правильно запустить приложение .NET. Есть ли что-то, что мне нужно настроить или сделать что-то в этом случае?

Еще одна вещь, на которую следует обратить внимание, это то, что FusionLog показывает, что PrivatePath установлен в NULL, и говорит, что «Файл конфигурации приложения не найден». Это очень странно для меня, потому что я также добавил конфигурационный файл в тот же каталог, чтобы указать PrivatePath, но это, похоже, тоже ничего не делает.

Итак, я предполагаю, что мне нужно передать определенную переменную env или что-то еще при создании процесса .NET.

Но я не могу придумать ни одного варианта, который мне нужно использовать. Кто-нибудь может дать мне какое-нибудь предложение?

Заранее спасибо.

...