Здравствуйте , пытаюсь разобраться с взаимодействием неуправляемого и управляемого кода , но что-то пока не получается.
В проекте на С# пишу как полагается :

В библиотеке на С++ есть класс :



В С# после вызова


Выкидывается исключение System.EntryPointNotFoundException
( то есть не была найдена точка входа parse в lib.dll )
Никак не могу понять почему , ведь в dll библиотеке есть точно метод
с названием parse .
Заранее спасибо.

@темы: C++, C#

Комментарии
11.09.2011 в 17:54

Пау-чок
Я не очень уверен, но мне кажется, что надо в DllImport добавить EntryPoint="lib.Parser.parse".
11.09.2011 в 18:12

Попробовал , все равно к сожалению пишет : не удается найти точку входа "lib.Parser.parse" в DLL "lib.dll"
12.09.2011 в 01:49

Life is a life... We are the humans...
а если так:
[DllImport("lib.dll",CharSet = CharSet.Ansi, ExactSpelling = true)]
internal static extern void parse(String exp);
15.09.2011 в 00:08

Увы,тоже не помогло
15.09.2011 в 02:46

Life is a life... We are the humans...
хм..
а если в си-шном коде из которого библиотека генерится

15.09.2011 в 07:08

В си-шном коде лучше вытащить метод из класса — если все равно не принципиально.
Без класса у меня все работало.
16.09.2011 в 04:14

Пау-чок
Насколько я понял из этой статьи, каждый компилятор C++ представляет точку входа того или иного метода совершенно по-совему. Т.е. например gcc обзывает public static void lib::Parser::parse(char*) вот таким именем: "_ZN3lib6Parser5parseEPc". И именно вот это безобразие и надо запихивать в EntryPoint аттрибута DllImport. Но это только если dll'ка была скомпилена gcc'шкой. MSVC обзавёт тот же самый метод чем-то вроде "?parse@Parser@lib@@SA@PD". Точно узнать можно только если расковырять саму dll'ку.
Поэтому, мне кажется, раз уж экспортируется всё равно статический метод, то лучше всего добавить к исходникам dll'ки файл типа "exports.c":


И собирать dll'ку вместе с этим файлом.
Тогда сразу будет понятно, что нужная функция называется "parse".
17.09.2011 в 03:12

Спасибо , но не работает , а не работает видимо из-за того что , в файле Parser.h изначально тип класса был ref ( хотя может
это и не из-за этого было) , который я видимо удалил(копипастя свой класс) , и при компиляции который почему-то работал , но после того как я снес висту работать перестал . Теперь где-то выдается 30 error-ов , поэтому я написал новый парсер на с# , который отлично работает )
Но всё равно всем спасибо . Так что , извиняюсь за потраченное время.