Вызов библиотеки c ++ из c # - PullRequest
5 голосов
/ 02 июня 2010

Этот вопрос может показаться повторением предыдущих. Я прочитал серию постов, но не совсем ясно для моей ситуации.

У меня есть библиотека c ++, созданная с использованием моментальной IDE. Я должен быть в состоянии использовать эту библиотеку в проекте C #.

Кто-то работал над этим проектом до того, как его передали мне. В настоящее время есть 2 слоя, чтобы сделать это возможным. Во-первых, проект c ++ включает в себя полную библиотеку с оболочкой c ++. Этот проект создает DLL в качестве вывода. Эта c ++ dll затем подается в проект c #, который имеет вызовы dllimport к c ++ dll. Этот проект C # снова создает DLL. Наконец, чтобы использовать библиотеку в приложении c #, я должен включить ссылку на обе эти библиотеки.

Это правильный способ заставить его работать? Я думал, что, вероятно, должен быть способ упростить процесс.

Может кто-нибудь помочь мне с этим вопросом?

Ответы [ 3 ]

7 голосов
/ 02 июня 2010

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

По сути, вы создаете управляемую библиотеку C ++ в Visual Studio, ссылаетесь на существующую библиотеку C ++ и создаете управляемую оболочку вокруг существующих классов C ++. Затем вы ссылаетесь на эту (управляемую) сборку C ++ в своем проекте C # и включаете оригинальную (неуправляемую) библиотеку C ++ в свою сборку C #, как файл, который помещается в каталог сборки.

Это необходимо, потому что нет способа ссылаться на такие вещи, как классы C ++, через вызовы P / Invoke (DllImport).

Если ваша базовая библиотека является просто набором функций, то вы можете ссылаться на это непосредственно в проекте C # с помощью функций P / Invoke.

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

2 голосов
/ 02 июня 2010

Похоже, у вас слишком много одной обертки, но, возможно, кто-то реализует какой-то фасад или добавляет свойства или что-то в этом роде. Основным соединением между управляемым и неуправляемым будет либо DllImport «плоских» вызовов функций, а не функций-членов, либо код C ++ / CLI, вызывающий функции-члены. Если оболочкой является C ++ / CLI, ее проще всего написать (просто включив заголовок для библиотеки C ++) и проще всего вызывать (код C # просто добавляет ссылку .NET и продолжает в обычном режиме), так что это будет мой первый выбор, если есть опыт C ++ по проекту.

Звучит так, будто тот, от кого вы перешли, делает это нелегко. Если существует менее 20 методов, я бы предложил начать все сначала.

0 голосов
/ 02 июня 2010

Вы можете использовать:

DllImport

class Example
{
    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...