Создание C ++ DLL, а затем ее использование в C # - PullRequest
4 голосов
/ 25 мая 2010

Хорошо, я пытаюсь создать C ++ DLL, которую затем могу вызвать и сослаться в приложении c #. Я уже сделал простую dll с использованием многочисленных руководств, однако, когда я пытаюсь сослаться на нее в приложении C #, я получаю ошибку

Невозможно загрузить DLL 'SDES.dll': указанный модуль не найден.

Код для программы следующий (потерпите меня, я собираюсь включить все файлы)

//These are the DLL Files.

#ifndef TestDLL_H
#define TestDLL_H

    extern "C"
    {
        // Returns a + b
        __declspec(dllexport) double Add(double a, double b);

        // Returns a - b
        __declspec(dllexport) double Subtract(double a, double b);

        // Returns a * b
        __declspec(dllexport) double Multiply(double a, double b);

        // Returns a / b
        // Throws DivideByZeroException if b is 0
        __declspec(dllexport) double Divide(double a, double b);
    }

#endif

//.cpp
#include "test.h"

#include <stdexcept>

using namespace std;

    extern double __cdecl Add(double a, double b)
    {
        return a + b;
    }

    extern double __cdecl Subtract(double a, double b)
    {
        return a - b;
    }

    extern double __cdecl Multiply(double a, double b)
    {
        return a * b;
    }

    extern double __cdecl Divide(double a, double b)
    {
        if (b == 0)
        {
            throw new invalid_argument("b cannot be zero!");
        }

        return a / b;
    }

//C# Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("SDES.dll")]
        public static extern double Add(double a, double b);
        static void Main(string[] args)
        {
            Add(1, 2); //Error here...
        }
    }
}

У кого-нибудь есть идеи, что мне может не хватать в моей программе? Дайте мне знать, если я пропустил какой-то код или у вас есть вопросы.

Ответы [ 5 ]

5 голосов
/ 25 мая 2010

Загрузите Dependecy Walker и откройте SDES.dll. Проверьте, все ли зависимые DLL могут быть загружены. Если вы видите отсутствующую зависимость, поместите эту dll в целевой каталог.

Вы используете 64-битную систему? Если да, вам следует ориентировать ваши C # и C ++ на одну и ту же архитектуру (как 32, так и 64-битную).

Я только что проверил ваши функции, и это сработало.

    [DllImport("Native_CPP.dll", CallingConvention=CallingConvention.Cdecl)]
    public static extern double Add(double a, double b); 

    static void Main(string[] args)
    {
        Console.WriteLine(Add(1.0, 3.0));

        Console.ReadLine();
    }

Выход:

4

Вот что я сделал с Visual Studio 2010:

  • создать новое решение
  • создать новый проект C #
  • создать новый проект C ++ - Dll (без MFC и прочего)
  • copy вставьте свой заголовок и cpp-файлы
  • сборка C ++ - Dll
  • скопировать DLL в каталог Debug / Release (зависит от того, что вы используете) вашего C # проекта (обычно «Solution / CSharpProjectName / bin / Debug /» или «Solution / CSharpProjectName / bin / Release /», соответственно)
  • добавить эту подпись P / Invoke в файл C #:

    [DllImport("Native_CPP.dll", CallingConvention=CallingConvention.Cdecl)] public static extern double Add(double a, double b);

    Примечание: Мне нужно было передать параметр CallingConvention.Cdecl, в противном случае я получил исключение.

  • Запустите C # -Проект, как показано выше

П.С .: Мне не нужно было устанавливать архитектуры. Это просто сработало. (Я использую машину x64 с 64-битной ОС.)

0 голосов
/ 25 мая 2010

Я только что скомпилировал код и не получил ошибки. Вот мои командные строки.

> cl /LD test.cpp -o SDES.dll
> csc test.cs
> test.exe
0 голосов
/ 25 мая 2010

положить SDES.dll в папку, где находится C # .exe.

0 голосов
/ 25 мая 2010

Где определено SimulateGameDLL? Я не вижу этого в коде C / C ++.

0 голосов
/ 25 мая 2010

это означает, что когда он пытался загрузить dll, он не мог найти его!

http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx

скорее всего, он не находится в том же каталоге, что и ваше приложение на C #.

также, самое время упомянуть

http://www.dependencywalker.com/

помогает найти проблемы с зависимостями DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...