Нужен совет C # / C ++ DLL - PullRequest
4 голосов
/ 22 июля 2010

Я успешно заставил Dreamweaver принять мою DLL и вызвать ее методы.DLL написана на C ++ с использованием функций с интерполяцией C (поэтому имена функций не искажены.)

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

Смогу ли я теоретически построить библиотеку DLL в C #, которая будет выглядеть "снаружи" так же, как библиотека DLL C?

и в качестве альтернативы

Смогу ли я "обернуть" C # DLL с работающей C DLL?

Основноечасть моей заботы - типы данных функций, так как, когда dreamweaver вызывает их, он ожидает указатели void и char в качестве формата для передачи данных туда и обратно.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 22 июля 2010

Вопреки распространенному мнению, возможно .
См. здесь .

6 голосов
/ 22 июля 2010

Да, компилятор C ++ / CLI делает это легко.Он автоматически генерирует «thunk», который гарантирует, что CLR загружается, когда неуправляемая программа вызывает экспортированную функцию.Лучше всего продемонстрировать на примере.

Начиная с кода C #, создайте новый проект из шаблона проекта библиотеки классов.Вам придется написать статический метод, необходимый, потому что код C ничего не знает о классах.Вот простой пример:

using System;

namespace ClassLibrary1 {
    public static class Mumble {
        public static int method(int arg) { return arg; }
    }
}

Щелкните правой кнопкой мыши имя решения в окне обозревателя решений, Добавить + новый проект.Выберите Visual C ++, CLR, библиотека классов.Щелкните правой кнопкой мыши новый проект, Свойства, Общие свойства, Каркас и Ссылки, нажмите Добавить новую ссылку.На вкладке "Projects" выберите проект C #.

Откройте файл .cpp и напишите код, подобный следующему:

#include "stdafx.h"

using namespace ClassLibrary1;

extern "C" __declspec(dllexport)
int method(int arg) {
    return Mumble::method(arg);
}

Build.Теперь эта DLL может использоваться вашим неуправляемым кодом, она может вызывать функцию «method».Как эту DLL, так и вашу C # DLL необходимо скопировать в каталог неуправляемой программы.

Остерегайтесь накладных расходов при вызове этого метода.Thunk, который генерирует компилятор C ++ / CLI, выполняет большую часть работы, чтобы гарантировать, что CLR загружен и инициализирован.Отладка будет отменена (используйте Debugger.Break ()), а необработанные управляемые исключения приведут к аварийному завершению вашей программы с очень плохой диагностикой.

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

Вы можете создать COM-оболочку вокруг .NET DLL .Сейчас я использую это для вызова функций .NET из более старого кода C / C ++.

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