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.
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