Как получить метод класса из загруженной DLL-библиотеки C # в C ++? [Дубликат]

Типы ссылок по умолчанию равны null, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаетесь, а его нет, вы получите исключение NullReferenceException.

Для Ex:

SqlConnection connection = null;
connection.Open();

Когда вы запускаете это кода, вы получите:

System.NullReferenceException: Object reference not set to an instance of an object.

Вы можете избежать этой ошибки, например, следующим образом:

if (connection != null){
    connection.Open();
}

Примечание. Чтобы избежать этой ошибки, вы всегда должны инициализировать свои объекты прежде чем пытаться что-либо сделать с ними.

15
задан user186246 27 April 2010 в 10:17
поделиться

4 ответа

Сначала я использовал COM-взаимодействие, но теперь я переключился на IJW (он просто работает), поскольку он намного проще. У меня есть оболочка C ++ / CLR DLL (скомпилировать с /clr).

Простой пример (с использованием статики для облегчения вызовов):

namespace MyClasses       
{
    public class MyClass
    {
        public static void DoSomething()
        {
            MessageBox.Show("Hello World");
        }
    }
}

В DLL я могу ссылочные пространства имен следующим образом:

using namespace MyClasses;

И назовите его:

__declspec(dllexport) void CallManagedCode()
{
    MyClass::DoSomething();
}

Теперь у вас есть неуправляемый DLL-экспорт «CallManagedCode», который вызывает управляемый код.

Конечно, вам также нужно преобразовать данные между управляемой / неуправляемой границей. Начиная с VS2008, Microsoft включает помощника маршала для преобразования между неуправляемыми и управляемыми типами. См. http://msdn.microsoft.com/en-us/library/bb384865.aspx

5
ответ дан Daniel Rose 25 August 2018 в 05:08
поделиться
  • 1
    Вам действительно не нужно идти по этому маршруту вручную. Проверьте ссылку в своем ответе. В c # вполне возможно иметь аналог DllImport, включая всю маршалинскую доброту, которая поставляется с .Net. Моя задача MSBuild добавляет соответствующие vt-fixups после сборки, и вам не нужно развертывать другую сборку ... – Robert Giesecke 27 April 2010 в 14:00
  • 2
    Я попробовал: DLL имеет экспорт. Однако как я должен его использовать? Я не нашел .lib, чтобы я мог ссылаться на DLL. – Daniel Rose 28 April 2010 в 13:33
  • 3
    Я не использую C ++, но я думаю, что это ничем не отличается от того, что вы хотели бы для любой библиотеки, которая не поставляется с заголовками C / C ++: Напишите заголовок для функций, которые вы хотите импортировать самостоятельно. Как я уже сказал, я не использую C ++. Это довольно просто с C или Delphi. – Robert Giesecke 28 April 2010 в 17:10
  • 4
    Заголовки не проблема. Для связи с библиотекой вам нужен .lib, иначе вам придется использовать LoadLibrary () и GetProcAddress () для каждого вызова. I "решена" он вручную генерирует .def и генерирует .lib из этого, как в support.microsoft.com/kb/131313 . Кроме того, сам вызов метода был неудачным (стандартный вариант использования при создании пользовательского интерфейса вызова -thread-сейф). Могу ли я связаться с вами по электронной почте? Я нигде не нашел адрес. – Daniel Rose 28 April 2010 в 17:57
  • 5
    уверен, robert dot giesecke [at] google mail – Robert Giesecke 28 April 2010 в 21:29

RE: Как вызвать управляемый код C # из неуправляемого приложения C ++?

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework .interop / 2005-05 / msg00030.html

Вызов управляемых .NET C # COM-объектов из неуправляемого кода на C ++ ...

http: // www .codeproject.com / KB / cs / ManagedCOM.aspx

Обтекание управляемой C # DLL в неуправляемом проекте C ++: dll.

http: // www.experts-exchange.com/Programming/Languages/.NET/Q_22006727.html

0
ответ дан ratty 25 August 2018 в 05:08
поделиться
  • 1
    Я выполнил вторую ссылку, которую вы предоставили, и успешно скомпилировал файл cpp, но не смог запустить его. Он не работает в CreateInstance (), используя smartpointer ..... поэтому iam не смог вызвать функции c # dll – user186246 27 April 2010 в 10:35
  • 2
    Пожалуйста, напишите здесь решение или, по крайней мере, краткое изложение его. Ссылка может быть нарушена в будущем. А также здесь легче читать все решения. Если их более одного, вы можете опубликовать их как несколько ответов. Благодаря! ;) – bluish 15 September 2015 в 14:07

Или используйте проект моего , который позволяет C # создавать неуправляемый экспорт. Их можно использовать так, как если бы они были написаны на родном языке.

8
ответ дан Robert Giesecke 25 August 2018 в 05:08
поделиться
  • 1
    Привет, Это выглядит очень интересно. У вас есть версия для VS 2010, или вы можете указать мне, какие изменения нужно сделать, чтобы сделать ее доступной для VS 2010 / Net 4? благодаря – bzamfir 14 December 2011 в 01:00
  • 2
    Должно работать просто отлично (я использую его сам в 2010 году), вы можете изменить целевую структуру только что созданного проекта до 4.0. VS 2010 по умолчанию используется .Net 2.0, когда нет настройки целевой инфраструктуры. – Robert Giesecke 14 December 2011 в 12:53
  • 3
    Спасибо, отлично. Я видел это (я создал образец тестового пустого проекта, но не тестировался, если он еще работает) – bzamfir 15 December 2011 в 14:37
  • 4
    Hallo Robert. Я использую ваш проект, и все работает отлично, за исключением случаев, когда функция C # возвращает строку []. Я получаю сообщение об ошибке: Unhandled Exception: System.Runtime.InteropServices.MarshalDirectiveException: не может вывести «возвращаемое значение»: неверная комбинация управляемых / неуправляемых типов. На странице проекта нет примера при работе с массивами в качестве типа возврата. Есть ли какой-нибудь пример, где я могу увидеть, как получить массив строк в C ++? Заранее спасибо. – a.ilic 29 March 2013 в 00:44

Я использовал классы оболочки C ++ / CLI , описанные здесь , и это было относительно легко реализовать.

1
ответ дан Simon 25 August 2018 в 05:08
поделиться
  • 1
    Пожалуйста, напишите здесь решение или, по крайней мере, краткое изложение его. Ссылка может быть нарушена в будущем. А также здесь легче читать все решения. Если их более одного, вы можете опубликовать их как несколько ответов. Благодаря! ;) – bluish 15 September 2015 в 14:12
Другие вопросы по тегам:

Похожие вопросы: