DllImport оформлено имя проблема-не удается найти точку входа



У меня странная проблема у меня есть DLL C++, которую я импортирую в библиотеку C# с помощью импорта DLL. Если я укажу точку входа, все будет работать, как и ожидалось, вот пример:



internal static class UnsafeMethods
{
[DllImport("GoodSchool.dll", EntryPoint = @"?AddNum@@YAHHH@Z")]
public static extern int AddNum(int num1, int num2);
}

class Program
{
static void Main(string[] args)
{
Console.WriteLine(UnsafeMethods.AddNum(4,5));
}
}


Однако, если я использую упрощенный импорт, как здесь:



[DllImport("GoodSchool.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AddNum(int num1, int num2);


Я получаю знакомое сообщение об ошибке:



Необработанное Исключение: Система.EntryPointNotFoundException: не удается найти точку входа с именем 'AddNum' в DLL ' GoodSchool.dll '



Я использовал depends, чтобы проверить, что метод правильно открыт, и я расшифровал нотацию, чтобы проверить параметры и соглашение об именовании-все кажется хорошим.



Сигнатура функции в C++ очень проста:



  __declspec(dllexport) int AddNum(int num1, int num2); 


Есть предложения, как я могу вызвать этот метод в C#, не предоставляя оформленное имя в качестве точки входа? Что я делаю не так? Я не хочу использовать экспорт "C", поскольку мое понимание заключается в том, что оформленное имя функции идеально подходит для использования с DllImport.

569   2  

2 ответов:

C++ искажает имена функций, чтобы учесть перегрузку имен функций. В конце концов, если бы DLL имела

__declspec(dllexport) int AddNum(int num1); 
__declspec(dllexport) int AddNum(int num1, int num2); 

На что будет ссылаться AddNum?

Символ ?AddNum@@YAHHH@Z - это искаженное (иначе оформленное) имя, отображаемое в неуправляемой библиотеке DLL.

Https://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B

Ваша библиотека DLL не экспортирует то, что называется AddNum.

Оформленное имя функции хорошо использовать с DllImport, как вы можете видеть по тому факту, что вы это делаете. Но для этого необходимо указать оформленное имя функции в импорте. Неразборчивое имя не существует в том, что касается компоновщика (статического или динамического) - AddNum просто не является символом, который предоставляет ваша библиотека.

Если вы хотите сделать то, о чем просите:

Вызовите этот метод в C# без указания оформленного имени как Точка входа?

Тогда вы не можете позволить C++ исказить имя в первую очередь. Вы можете либо указать оформленное имя в DllImport или использовать extern "C" связь в коде C++. Вы должны выбрать одно или другое.

Comments

    Ничего не найдено.