Я получил C++ dll, который должен быть интегрирован в проекте C#.
Я думаю, что нашел корректный способ сделать это, но вызов dll дает мне эту ошибку: Система. BadImageFormatException: была предпринята попытка для загрузки программы неверным форматом. (Исключение из HRESULT: 0x8007000B)
Это - функция в dll:
extern long FAR PASCAL convert (LPSTR filename);
И это - код, который я использую в C#
namespace Test{
public partial class Form1 : Form
{
[DllImport("convert.dll", SetLastError = true)]
static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename);
private void button1_Click(object sender, EventArgs e)
{
// generate textfile
string filename = "testfile.txt";
StreamWriter sw = new StreamWriter(filename);
sw.WriteLine("line1");
sw.WriteLine("line2");
sw.Close();
// add checksum
Int32 ret = 0;
try
{
ret = convert(filename);
Console.WriteLine("Result of DLL: {0}", ret.ToString());
}
catch (Exception ex)
{
lbl.Text = ex.ToString();
}
}
}}
Какие-либо идеи о том, как возобновить это?
Большое спасибо, Frank
попробуйте использовать __stdcall
(или WINAPI
или APIENTRY
) в функции, экспортируемой из DLL.
Попробуйте переключить код C # с AnyCPU на x86 (в диалоговом окне «Свойства»).
Экспортированная функция использует соглашение о вызовах PASCAL
, которое в Windows совпадает с stdcall
. Среда выполнения .Net должна знать об этом, поэтому измените подпись вашего метода C # следующим образом:
[DllImport("convert.dll", SetLastError = true, CallingConvention=CallingConvention.StdCall)]
static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename);