c # - Kunne ikke indlæse fil eller samling 'protobuf-net' -fejl, hvis jeg starter .NET-proces via CreateProcess ()

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har oprettet en .NET-applikation i C #, og den udføres fint, når jeg kører det fra console cmd-vinduet, men hvis jeg forsøgte at starte programmet fra min egen app skrevet i C ++ ved at kalde CreateProcess (), får jeg undtagelse som følger.


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()


Sådan kalder jeg 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, Parent-proces og .NET-applikation, som jeg oprettede begge, ligger i samme mappe, og jeg har protobuf-net.dll også i den pågældende mappe. Ellers burde det ikke have været korrekt at starte fra cmd-vinduet.


protobuf-net.dll er ikke i GAC, og jeg antager, at så længe det er i samme mappe, skal det være muligt at finde dll og starte .NET applikation korrekt. Er der noget, jeg skal konfigurere eller gøre noget i dette tilfælde?


Den anden ting at bemærke er, at FusionLog viser, at PrivatePath er sat til NULL, og det står at 'Ingen applikations konfigurationsfil fundet.' Dette er meget mærkeligt for mig, fordi jeg også tilføjede config-fil til den samme mappe for at angive PrivatePath, men det ser heller ikke ud til at gøre noget.


Så jeg antager, at jeg skal passere visse env-variable eller noget, når jeg opretter en .NET-proces.


Men jeg kan virkelig ikke tænke på nogen mulighed, som jeg skal bruge.
Kan nogen give mig noget forslag?


Tak på forhånd.

Bedste reference