Я боролся с этим уже несколько дней. У меня есть проект Visual Studio .net, написанный на C #, который должен загрузить DLL, написанную на C, с использованием компиляторов gcc в IDE Codeblocks.
DLL может быть загружена и использована нормально, но когда я использую vsnprintf в dll, проект .net говорит: «Невозможно загрузить DLL. Указанный модуль не найден». всякий раз, когда я пытаюсь вызвать функцию из DLL.
Соответствующий код C #:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace Scratchpad
{
public partial class frmMain : Form
{
[DllImport("testpielibs", CallingConvention = CallingConvention.Cdecl)]
static extern void SomeFunction(string a);
private void button3_Click(object sender, EventArgs e)
{
SomeFunction("ABC");
}
}
}
Соответствующий код C (DLL):
#include <stdio.h>
#include <stdarg.h>
#define DLL_EXPORT __declspec(dllexport)
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
int log_printf(char *format, ...)
{
char msg[256];
va_list ap;
memset(msg, 0, sizeof msg);
va_start(ap, format);
vsnprintf(msg, 256, format, ap);
va_end(ap);
return 0;
}
Обратите внимание, что SomeFunction даже не вызывает log_printf. Проект строится нормально, независимо от того, и когда я закомментирую строку с помощью vsnprintf, он работает так же, как и с проектом .net, но именно эта строка приводит к невозможности загрузки dll в проекте .net.
В случае, если это важно, вот мои библиотеки компоновщика для DLL:
ws2_32
iphlpapi
mswsock
winmm
user32
Кроме того, я чувствую, что может быть важно отметить, что на днях, как раз перед тем, как все это произошло, я получил сообщение об ошибке из кодовых блоков, сообщающее о повреждении моего файла конфигурации. До этого этот проект работал нормально, но мне пришлось вернуться и вручную переназначить настройки компилятора и компоновщика.
Есть предложения?
ОБНОВЛЕНИЕ: snprintf вызывает ту же проблему. Я могу использовать sprintf и vsprintf, но snprintf и vsnprintf приводят к тому, что dll не загружается в проект C #, даже если dll будет по-прежнему создаваться без ошибок или предупреждений. Я рассмотрел соглашения о вызовах, используемые для импорта моих функций dll в мой проект на c #, и Cdecl, похоже, подходит для этого, поскольку в нем конкретно сказано, что он «позволяет вызывать функции с помощью varargs, что делает его подходящим для использования для методов, которые принимают переменное количество параметров, таких как Printf. " Я также попытался импортировать SomeFunction с использованием соглашений о вызовах Winapi, StdCall и ThisCall, но все они имеют одинаковые результаты. Буду очень признателен за любую помощь, я был на некоторое время в тупик.