Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перекомпилировать с С в С#? компиляция файла с С в С# 
:(
    Опции темы
myendlessness
Дата 9.6.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



 Всем доброго времени суток! 
          Ребята подскажите, пожалуйста, у меня есть C# проект и есть десяток файлов написанных на С. Я  добавил С файлы в С#-проект а теперь надо как-то использовать те библиотеки, которые написаны на С, что необходимо сделать, как перекомпилировать или может есть другие возможности? Спасибо за помощь! 
PM MAIL   Вверх
DVariuS
Дата 9.6.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 5
Всего: 8



myendlessness, если библиотека на С - компиль ее отдельно, а в коде C# юзай DllImport для импорта функций.
PM MAIL   Вверх
myendlessness
Дата 9.6.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Спасибо за рекомендацию. Только сейчас понял, что неправильно выразился, на C  у меня есть файлы с расширением *.h,*.c именно эти файлы я добавил в C# проект, а теперь в моём С# проекте нужно использовать некоторые функции из фалов написанных на С.  
PM MAIL   Вверх
PashaPash
Дата 9.6.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



myendlessness, компиль эти .c/.h файлы в отдельную dll, и подключай ее через DllImport, как тебе посоветовали выше.
C и C# - два совсем разных языка под две разные платформы. в них только скобки одинаковые.


--------------------
PM MAIL WWW   Вверх
myendlessness
Дата 11.6.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Ребята сделал всё как описано в МСДН получил два файла  H and CPP: 

H file is:
Код

namespace MathFuncs
{
      class __declspec(dllexport) MyMathFuncs
    {
    public:
        // Returns a + b
       double Add(double a, double b);

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

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

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


CPP file is:
Код

#include "targetver.h"

#include "MathFuncsDll.h"

#include <stdexcept>

using namespace std;

namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }

    double MyMathFuncs::Multiply(double a, double b)
    {
        return a * b;
    }

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

        return a / b;
    }
}


Скомпилировал, получил библиотеку DLL

Затем пишу в своём C# проекте: 

[DllImport("D:/Visual Studio 2008/Projects/EncoderDecoder_1/EncoderDecoder_1/bin/MathFuncsDll.dll", EntryPoint = "MathFuncs", SetLastError = true,
       CharSet = CharSet.Unicode, ExactSpelling = true,
         CallingConvention = CallingConvention.StdCall)]

public static extern bool MyAdd(int a, int b);

дальше пытаюсь сложить два числа 

        int a = 9;
        int b = 10;
        MyAdd(a, b);

И в итоге выдаёт, что неправильная EntryPoint, подскажите, пожалуйста, что считается EntryPoint и как правильно мне использовать функции?

Читал МСДН, но пока не могу догнать, что именно надо писать в EntryPoint!

Добавлено через 13 минут и 19 секунд
Да ещё заметил, что int нужно поменять на double, а то это ошибка! Но всё равно не хочет работать. 

public static extern double MyAdd(double a, double b);

дальше пытаюсь сложить два числа 

        double a = 9;
        double b = 10;
        double c;
        
        c = MyAdd(a, b); - вылетает здесь?

PM MAIL   Вверх
myendlessness
Дата 11.6.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



 smile 

В общем разобрался!  По крайней мере понял как реализовать одним из способов! Значит нужно написать следующим образом:

EntryPoint="#1" и тогда всё работает, то есть пишем # и порядковый номер функции в библиотеке, если например нужен Multiply, то пишем    EntryPoint="#3"

Спасибо Всем кто помагаетsmile I'll be back  smile 
PM MAIL   Вверх
Mephisto
Дата 12.6.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



myendlessness, а причем тут С++? Ты же вроде про С# говорил вначале?  smile 
Ты мог такую же библиотеку на С написать. smile

Это сообщение отредактировал(а) Mephisto - 12.6.2009, 19:28
PM   Вверх
Любитель
Дата 16.6.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Цитата(myendlessness @  11.6.2009,  10:08 Найти цитируемый пост)
И в итоге выдаёт, что неправильная EntryPoint, подскажите, пожалуйста, что считается EntryPoint и как правильно мне использовать функции?

У тебя там неймспейс, да ещё и класс - в итоге, конечно, имя функции получается ужасным (можно посмотреть любой утилитой, показывающей таблицу экспорта).


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.