2010-06-02 4 views
5

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

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

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

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

Может кто-нибудь, пожалуйста, помогите мне с этим вопросом?

+0

Возможный дубликат [Как я могу называть C++ с C#?] (http://stackoverflow.com/questions/2211867/how-do-i-call-native-c-from-c) – Randolpho

ответ

7

Учитывая, что вы используете 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

+1, но я хотел бы указать, что, если вы не используете .NET. 1.1, «управляемый C++» теперь называется «C++/CLI», и между ними существуют * огромные * различия. – Randolpho

+0

Кроме того, я думаю, вы имеете в виду «вы не можете динамически связывать неуправляемую библиотеку». * Статически * привязка - единственный способ использовать библиотеку. – Randolpho

+0

Большое вам спасибо. Как вы уже упоминали, неуправляемая библиотека имеет классы и интерфейсы. В этом случае я полагаю, что мне нужно иметь C++-оболочку и оболочку C#, чтобы иметь возможность использовать неуправляемый C++ lib в моем приложении C#, так? Теперь оболочка C++ выполняет задачу создания экземпляра классов и реализации интерфейса, это правильно? У меня есть другой вопрос. Является ли задачей неуправляемой библиотеки предоставлять внешние функции «C» и «dllexport»? В настоящее время это не так, но я могу добавить это как требование для следующего проекта, так что просто хочу убедиться. – Batul

0

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

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); 
    } 
} 
2

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

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

+0

Начиная с того, что было похоже на лучшее решение для меня, но как только я начал, все, что я смотрел, только указал, что текущее решение является правильным способом сделать это. То, что я понимаю из вашего предложения, также должно иметь оболочку C++ для обработки классов в неуправляемой библиотеке C++, а затем использовать вызовы dllImport в C#. Я прав? – Batul

+0

Если вы добавите оболочку C++/CLI, это может спасти вас от P/Invoke (DllImport.) В основном ваш код C++/CLI может просто «включить заголовок, ссылку на lib», чтобы использовать ваш собственный код. Все, что является «public ref class Foo» в коде C++/CLI, можно вызывать из C# без механизма взаимодействия, просто добавьте ссылку и используйте ее. –

+0

Спасибо, Кейт. Из того, что я прочитал до сих пор, DllImport требует плоской структуры в неуправляемой библиотеке lib, т. Е. Нет классов и интерфейсов. Но моя неуправляемая библиотека имеет классы и интерфейсы, так значит ли это, что я не могу использовать DllImport? Если это так, то создание оболочки C++/cli - единственный способ пойти? – Batul

Смежные вопросы