Способ Как скомпилировать библиотеку C в .Net DLL? - PullRequest
5 голосов
/ 13 июля 2010

Можем ли мы скомпилировать библиотеку C как .Net dll (содержащую и открывающую доступ ко всем функциям C libs), просто скомпилировав проект cpp, содержащий код типа

extern "C" {
#include <library.h>
}

с аргументом /clr:pure с VS?(VS10)

Или мы должны сделать что-то более хитрое?

Ответы [ 4 ]

4 голосов
/ 15 сентября 2016

Это может вас заинтересовать: Компиляция кода на C для .NET

Создание компилятора C occil.exe

Чтобы создать .NET dll изкод ac, например stack.c

Step1: сборка stack.c для IL-кода

occil /ostackdll.il /c /Wd /9 /NStackLib.Stack stack.c

Step2: сборка для сгенерированного IL-кода в .NET DLL

ilasm /DLL stackdll.il

Затем вы можете ссылаться на stack.dll в программе ac # и вызывать функцию C в stack.c

3 голосов
/ 13 июля 2010

Я обнаружил, что для этого лучше всего использовать старый стиль Managed C ++.

CLR:PURE просто не обрежу его.

Пример:

extern "C" int _foo(int bar)
{
  return bar;
}

namespace Bar
{
  public __gc class Foo
  {
  public:
    Foo() {}

    static int foo(int bar)
    {
      return _foo(bar);
    }
  };
};

Скомпилируйте с: /clr:oldSyntax

Теперь вы можете ссылаться на сборку и вызывать Bar.Foo.foo() из .NET.

3 голосов
/ 13 июля 2010

Это действительно зависит от вашего кода C.

P / Invoke часто проще всего начинать, а IMO довольно работоспособен для нескольких функций. Производительность не обязательно велика, и я бы не стал создавать из нее целую программу, но для повторного использования некоторых функций это стоит.

Переход от C к / clr: pure требует от вас:

  1. Преобразование кода C в C ++
  2. Преобразование кода C ++ в Visual C ++
  3. Компиляция с параметром / clr
  4. Компилировать с / clr: pure

Текущее состояние вашего кода (и его библиотек) будет определять, насколько болезненным является этот процесс.

1 голос
/ 13 июля 2010

Обычно не дано, что вы даже можете скомпилировать код C как C ++ без внесения некоторых изменений.Если вы можете заставить свой код C компилироваться как C ++, тогда вы можете попробовать заставить его компилировать как C ++ / CLI (это то, что делает опция clr: pure).

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

Некоторые разновидности такого рода вещей могут быть выполнены с помощью приемов препроцессора C ++ (макросы и т. д.), иногда вы в конечном итогенаписание оболочек вручную.

Итак, основная информация, которую вы можете скомпилировать C ++ в сборки .NET с помощью параметров / clr: xxx, верна, но это не значит, что это единственное, что вам нужно сделать, чтобы получить полезнуюСборка .NET.

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