Используя C++ DLL в проекте C#

Я получил 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

6
задан Frank 8 June 2010 в 07:41
поделиться

3 ответа

попробуйте использовать __stdcall (или WINAPI или APIENTRY) в функции, экспортируемой из DLL.

4
ответ дан 9 December 2019 в 20:40
поделиться

Попробуйте переключить код C # с AnyCPU на x86 (в диалоговом окне «Свойства»).

4
ответ дан 9 December 2019 в 20:40
поделиться

Экспортированная функция использует соглашение о вызовах PASCAL , которое в Windows совпадает с stdcall . Среда выполнения .Net должна знать об этом, поэтому измените подпись вашего метода C # следующим образом:

[DllImport("convert.dll", SetLastError = true, CallingConvention=CallingConvention.StdCall)]
static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename);
4
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: