Написание .NET объекта в C? - PullRequest
1 голос
/ 01 октября 2009

Есть ли способ написать объект на C / C ++, который можно использовать из .NET? Я хотел бы сделать это наиболее простым способом, который использовался для расширения в основном всех других языков, то есть писать объект на C, соответствовать интерфейсу, требуемому для среды выполнения языка, использовать объект из языка.

Ответы [ 7 ]

3 голосов
/ 01 октября 2009

Если вы используете управляемый C ++, который компилируется в код IL, так что его можно использовать прямо на любом языке .NET.

Для неуправляемого кода C / C ++ вам нужно использовать P / Invoke в коде .NET для его вызова.

1 голос
/ 02 октября 2009

Если P / Invoke или C ++ / CLI не подходят для вашей задачи, вы можете использовать поддержку COM в .NET.

Вот пример для этого:

C ++ часть

C # часть

Работает как в MS.NET, так и в Mono .

0 голосов
/ 15 января 2010

В настоящее время Mono не может скомпилировать C ++ / CLI , к сожалению, поэтому, хотя C ++ / CLI, вероятно, является наиболее эффективным и простым способом выполнить то, что вы просите, он, вероятно, не сработает для вас. Вы можете скомпилировать сборку C ++ / CLI с помощью инструментов .NET, возможно, , но даже это может не сработать (прокрутите вниз до ответа на вопрос «Могу ли я выполнить свою программу Visual Studio .NET ...» ).

P / Invoke или COM-взаимодействие должны это делать, хотя P / Invoke влечет за собой потенциальные проблемы с производительностью, а COM-взаимодействие означает, что вам нужно превратить свой ранее простой интерфейс vanilla C в интерфейс COM ... который, в C, разве это не приятно?

0 голосов
/ 15 января 2010

Если вы работаете с неуправляемыми типами (ECMA-334 §27.2) , например, массивами примитивных типов, вы можете сделать следующее. Поскольку это в значительной степени жертвует безопасностью кода, я настоятельно рекомендую сначала попробовать альтернативы и прибегать к этому, только если P / Invoke оказывается медленным в сборках релизов вне отладчика (отладчик использует намного медленнее P / Invoke (в 100 раз медленнее). ) для отлова нескольких видов сбоев).

[DllImport("NativeLibrary.dll")]
private extern unsafe void NativeMethod(byte* data, int length);

byte[] data = new byte[10000000];
unsafe
{
    fixed (byte* ptr = data)
    {
        NativeMethod(ptr, data.Length);
    }
}
0 голосов
/ 08 октября 2009

Два способа:

C ++ / CLI: C ++ / CLI - это один метод, который делает вещи взаимозаменяемыми. Классы, которые вы создаете для CLI в C ++ / CLI, не совсем обычные старые классы C ++, но вы можете соединить классы C ++ с помощью шаблонов адаптера (следите за этими исключениями SEHException!)

P / Invoke: Если вы хотите разрабатывать с использованием базовых собственных библиотек C / C ++, вы можете получить доступ к любому стандартному экспорту C из CLR, используя P / Invoke , и вы можете Marshall свои объекты вручную, если вы объявите их прямо с обеих сторон. Обратитесь к руководству " Взаимодействие с собственными библиотеками " для получения дополнительной информации, которую вы когда-либо захотите узнать.

Я не могу это подчеркнуть достаточно. Следите за своими исключениями! Не позволяйте им уходить из вашего кода CLI в ваш собственный код или из вашего собственного кода в их код CLI.

0 голосов
/ 01 октября 2009

Вам нужно использовать C ++ / CLI (раньше назывался Managed C ++, но, как мне кажется, этот термин не рекомендуется маркетологами Microsoft).

C ++ / CLI - это расширенный набор C ++, который компилируется в .NET IL и предоставляет функции, обеспечивающие взаимодействие с другими языками .NET.

C ++ / CLI допускает смешанный управляемый и собственный код. Это единственный язык .NET, который поддерживает это.

0 голосов
/ 01 октября 2009

Вы можете создать библиотеку на C / C ++, экспортировать методы и использовать ее в .NET, используя P / Invoke .

...