У меня есть приложение C# и DLL C++, оба x86. Приложение — это стартовый проект, проект DLL находится внутри того же решения и упоминается как проект. DLL C++ выводит свой файл PDB с тем же именем, что и DLL внутри папки Debug приложения.
У меня есть функция с именем SomeFunction
, которую я пытаюсь выполнить на С#. Когда код достигает этой строки, он останавливается на ней. Пользовательский интерфейс приложения C# продолжает реагировать, но точка останова никогда не покидает эту строку (и это в Form_Load).
Если я попытаюсь установить DLL в качестве запускаемого проекта и указать ей выполнить приложение C#, то C# завершится сбоем в этой строке с: System.EntryPointNotFoundException: невозможно найти точку входа с именем «SomeFunction» в DLL «SomeDLL.dll».
Это объявление функции, которую я пытаюсь вызвать:
[DllImport("SomeDLL.dll", EntryPoint = "SomeFunction", CallingConvention = CallingConvention.Cdecl)]
public static extern int SomeFunction(IntPtr hwnd);
Это объявление функции из заголовка C++:
#define MYDLL_API __declspec(dllexport)
MYDLL_API extern int SomeFunction(HWND hWnd);
Вот как я называю это из С#:
var someAnswer = SomeFunction(_hwnd);
ОБНОВЛЕНИЕ: поскольку приведенное ниже обсуждение может занять некоторое время, вот ответ в двух словах: мне не хватало внешнего "C". Кроме того, для отладки DLL (что тоже было проблемой) проект должен поддерживать нативную отладку как с C++, так и с C#, вот отличный список, который я прошел, и в конце все было хорошо!
Нет символов, загруженных в смешанном С# C (win32) проект с использованием VS2010
SomeFunction
во время отладки? (.net может динамически загружать С++ dll) - person Dmitriy Zapevalov   schedule 07.08.2016