В случае, если из сотен строк вафли не было ясно, что касается искаженного экспорта. Вот мой 2с стоит :) 1001 *
После создания проекта с именем Win32Project2 с использованием VS 2012 и выбора экспорта всех символов в мастере. У вас должно быть 2 файла с именами Win32Project2.cpp и Win32project2.h
Оба будут ссылаться на примерную экспортируемую переменную и примерную экспортируемую функцию.
В Win32Project2.h у вас будет следующее:
#ifdef WIN32PROJECT2_EXPORTS
#define WIN32PROJECT2_API __declspec(dllexport)
#else
#define WIN32PROJECT2_API __declspec(dllimport)
#endif
extern WIN32PROJECT2_API int nWin32Project2;
WIN32PROJECT2_API int fnWin32Project2(void);
Чтобы отменить изменение двух последних строк, чтобы превратить объявления "C" в:
extern "C" WIN32PROJECT2_API int nWin32Project2;
extern "C" WIN32PROJECT2_API int fnWin32Project2(void);
В Win32Project2.cpp у вас также будут следующие определения по умолчанию:
// This is an example of an exported variable
WIN32PROJECT2_API int nWin32Project2=0;
// This is an example of an exported function.
WIN32PROJECT2_API int fnWin32Project2(void)
{
return 42;
}
Чтобы изменить ПРАВИЛА ИЗМЕНЕНИЯ ЭТОГО:
// This is an example of an exported variable
extern "C" WIN32PROJECT2_API int nWin32Project2=0;
// This is an example of an exported function.
extern "C" WIN32PROJECT2_API int fnWin32Project2(void)
{
return 42;
}
По сути, вы должны использовать префикс extern "C" перед объявлениями, чтобы заставить компоновщик выдавать непроверенные C-подобные имена.
Если вы предпочитаете использовать искаженные имена для этого дополнительного запутывания (в случае, если информация искажения кому-то полезна), используйте «dumpbin / exports Win32Project2.dll» из командной строки VC для поиска фактических имен ссылок. Он будет иметь вид "? FnWind32Project2 @ [param bytes] @ [other info]. Существуют также другие инструменты просмотра DLL, если запуск командной оболочки VC не поддерживает вашу лодку.
Точно, почему MS по умолчанию не придерживается этого соглашения, остается загадкой. Фактическая информация искажения означает что-то (например, размер параметра в байтах и более), что может быть полезно для проверки и отладки, но в остальном бесполезно.
Чтобы импортировать указанную выше функцию DLL в проект C # (в данном случае базовое приложение Windows на C # с формой, содержащей кнопку «button1»), вот пример кода:
using System.Runtime.InteropServices;
namespace AudioRecApp
{
public partial class Form1 : Form
{
[ DllImport("c:\\Projects\test\Debug\Win32Projects2.dll")]
public static extern int fnWin32Project2();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int value;
value = fnWin32Project2();
}
}
}