Прекарах няколко часа в търсене на отговора, така че разбрах, че ако се запитам, най-накрая мога да намеря решение на проблема си. Първо, за да опиша какво искам да направя: Така че , за да опиша дизайна по-горе, имам .dll плъгин, написан на чист c++ (не искам да съдържа никакъв .Net код). Този c++ плъгин ще се използва от софтуерна платформа. Сега искам услугата c# windows да взаимодейства със софтуерната платформа, но може да го направи само чрез c++ dll. Поради тази причина увих цялата функционалност на плъгина c++ в Wrapped Dll (експортирах функционалността) и използвам Wrapped Dll в услугата на c# windows.
Сега имам тестов метод, за да проверя дали експортирането на функционалността на c++ работи добре (само прост метод, който връща сумата от две цели числа) и виждам, че услугата на windows може да взаимодейства с неуправляваната dll на c++ в правилен начин, получавам правилните резултати. Проблемът, който имам, е, когато се опитвам да взаимодействам със софтуерната платформа чрез c++ unmanaged dll. Получавам следната грешка:
Разбрах, че грешката трябва да е, защото неуправляваната dll не може да бъде достъпна от софтуерната платформа и Wrapped Dll едновременно. За да разреша това, открих, че решението е да добавя неуправляваната dll в GAC. Но за да поставите dll в GAC, dll трябва да има силно име, но разбрах, че не мога да подпиша силно име към неуправляван код, освен ако нямам активирана опцията /clr. Но когато тази опция е активирана, неуправляемата dll не се компилира.
За да обобщим, има ли някакъв начин да накарам моята неуправляема dll да бъде достъпна от софтуерната платформа и от обвитата dll? Без интегрирането на .Net в моя неуправляван код?
Прекарах много часове в търсене на решението, така че би било чудесно, ако някой от вас може да ми покаже малко светлина в тунела!
Благодаря ти
[DllImport("C:\\Path\\MyNativeDll.dll", EntryPoint = CheckUserGroup")] public static extern bool _CheckUserGroup(string group);
Ето как импортирам метод от NativeDll в ManagedDll.public bool CheckUserGroup(string group) { return _CheckUserGroup(group); }
И ето как си взаимодейства. --› Този метод взаимодейства със софтуерната платформа, получава резултата и го връща към управляваната DLL и от управляваната Dll към услугата c# windows. Но, - person CompuPlanet   schedule 25.11.2014[DllImport("C:\\Path\\MyNativeDll.dll", EntryPoint = "TestMethod")] public static extern int _TestMethod(int x, int y);
, който прави изчислението на неуправляемия плъгин, без да взаимодейства със софтуерната платформа, резултатите, които получавам в услугата c# windows, са правилни. И така, това е причината да кажа, че не съм сигурен, че това е грешка в обвивката. - person CompuPlanet   schedule 25.11.2014C:\\Path\\MyNativeDll.dll
. Освен това преместете всички DLL файлове на платформата в директорията. - person BendEg   schedule 25.11.2014extern "C" MYNATIVEDLL_API bool __cdecl CheckUserGroup(LPCSTR clientGroup)
така се дефинира методът. И вътре в метода извиквам API на софтуерната платформа, за да получа UserGroup и го сравнявам с този, който получавам като параметър. Функционалността е правилна, тъй като я използвах преди. TestMethod, който работи, е следният:extern "C" SPOTOPTIONMTPLUGIN_API int __cdecl TestMethod(int x, int y) { return x+y; }
В първите ми два коментара по-горе ви показвам кода в WrappedDll. Това е кодът от Native c++ dll. - person CompuPlanet   schedule 25.11.2014