Использование C ++ DLL в проекте C # - PullRequest
6 голосов
/ 08 июня 2010

Я получил C ++ dll, который должен быть интегрирован в проект C #.

Я думаю, что нашел правильный способ сделать это, но вызов dll дает мне эту ошибку: System.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

Ответы [ 4 ]

4 голосов
/ 08 июня 2010

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

[DllImport("convert.dll", SetLastError = true, CallingConvention=CallingConvention.StdCall)]
static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename);
4 голосов
/ 08 июня 2010

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

4 голосов
/ 08 июня 2010

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

0 голосов
/ 31 декабря 2015

Два основных этапа:

1- Создание C ++ dll

В визуальной студии

**New->Project->Class Library** in c++ template Name of project here is first_dll in visual studio 2010. Now **declare your function as public** in first_dll.h file and write the code in first_dll.cpp file as shown below.

Заголовочный файл

Файл Cpp

Check **Project-> Properties -> Configuration/General -> Configuration Type** 
this option should be **Dynamic Library(.dll)** and build the solution/project now.

first_dll.dll файл создается в Папка отладки

2- Связывание в проекте C #

Открытый проект C #

Rightclick on project name in solution explorer -> Add -> References -> Browse to path
where first_dll.dll is created and add the file 

Добавьте эту строку вверху в проекте C #

Using first_dll; 

Теперь к файлу можно получить доступ с помощью инструкции ниже в некоторой функции

double var = Class1.sum(4,5);

Я связал проект C ++ .dll, созданный в VS2010, с проектом C #, созданным в VS2013. Это работает хорошо.

...