Как я называю блок.NET от C/C++?

В списке рассылки контроллера Ryu пользователь по имени IWAMOTO сказал мне, что мои значения hard_timeout были слишком большими для упаковки структуры (2 часа - 7200 секунд, я не знаю, где моя голова, чтобы найти 432000 хаха), после сокращения hard_timeout до 7200 секунд все работало просто отлично.

Всегда проверяйте размер значений, которые вы пытаетесь отправить в канал данных, посмотрите, не превышает ли он 65535.

26
задан cwick 19 September 2008 в 22:06
поделиться

9 ответов

[Guid("123565C4-C5FA-4512-A560-1D47F9FDFA20")]
public interface IConfig
{
    [DispId(1)]
    string Destination{ get; }

    [DispId(2)]
    void Unserialize();

    [DispId(3)]
    void Serialize();
}

[ComVisible(true)]
[Guid("12AC8095-BD27-4de8-A30B-991940666927")]
[ClassInterface(ClassInterfaceType.None)]
public sealed class Config : IConfig
{
    public Config()
    {
    }

    public string Destination
    {
        get { return ""; }
    }

    public void Serialize()
    {
    }

    public void Unserialize()
    {
    }
}

После этого, Вам нужен к regasm Ваш блок. Regasm добавит, что необходимые ключи реестра, чтобы позволить Вашему компоненту.NET быть видят как COM-компонент. После, можно назвать Компонент.NET в C++ таким же образом как любой другой COM-компонент.

12
ответ дан 28 November 2019 в 07:52
поделиться

Необходимо действительно изучить C++ / CLI. Это делает задачи как это почти тривиальными.

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

13
ответ дан 28 November 2019 в 07:52
поделиться

Я определенно исследовал бы C++ / CLI для этого и избежал бы COM и всех регистрационных стычек, который имеет тенденцию производить.

, Какова мотивация для использования C++? Если это - просто стиль тогда, Вы могли бы найти, что можно записать все в C++ / CLI. Если это - производительность, затем звоня назад и вперед между управляемым С++, и неуправляемый код является относительно прямым. Но это никогда не будет прозрачным. Вы не можете передать управляемый указатель неуправляемому коду сначала, не прикрепляя его так, чтобы сборщик "мусора" не перемещал его, и конечно неуправляемый код не будет знать о Ваших управляемых типах. Но управляемый (C++) код может знать о Ваших неуправляемых типах.

Еще одна вещь отметить состоит в том, что C++ / блоки CLI, которые включают неуправляемый код, будет архитектурно-зависимым. Вам будет нужно, разделяет сборки для x86 и x64 (и IA64).

4
ответ дан 28 November 2019 в 07:52
поделиться

Можно обернуть компонент.NET в COM-компонент - который довольно легок с инструментами.NET - и назовите его через COM.

0
ответ дан 28 November 2019 в 07:52
поделиться

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

Вы могли посмотреть на этот блог для получения некоторых конкретных деталей.

0
ответ дан 28 November 2019 в 07:52
поделиться

Создайте свой блок.NET как нормальный, но убеждаться отметить класс с ClassInterface (ClassInterfaceType. AutoDual) и быть уверенным информация о блоке SetAssemblyAtribute (верному) ComVisible.

Затем создайте обертку COM с REGASM:

regasm mydll.dll/tlb:mydll.tbl / кодовая база f: _ code\ClassLibraryForCom

убедиться использовать / директиву кодовой базы - необходимо, если Вы не собираетесь давать блоку строгое имя.

армированный пластик

0
ответ дан 28 November 2019 в 07:52
поделиться

Так как C# может импортировать экспорт стандарта C++, могло бы быть легче загрузить Ваш C++ dll в приложении C# вместо того, чтобы использовать COM от C++.

См. документацию для Системы. Время выполнения. InteropServices. DllImport.

кроме того, вот полный список типов Interop, который можно сделать между управляемым и неуправляемым кодом:

http://blogs.msdn.com/deeptanshuv/archive/2005/06/26/432870.aspx

Вкратце:

(a) Используя COM Interop

(b) Используя imports/pinvoke (явные вызовы метода)

(c) IJW и MC ++ приложения: MC ++ & приложения IJW могут свободно позвать назад и вперед друг друга.

(d) Хостинг. Это редко, но CLR может быть размещен неуправляемым приложением, что означает, что время выполнения вызывает набор хостинга обратных вызовов.

0
ответ дан 28 November 2019 в 07:52
поделиться

Если можно было и справиться и неуправляемый код в процессе, можно создать класс C++ с виртуальными функциями. Реализуйте класс со смешанным C++ режима / CLI. Введите реализацию к своему коду C++, так, чтобы (высокоуровневую) реализацию можно было назвать от Вашего кода C++ (низкого уровня).

0
ответ дан 28 November 2019 в 07:52
поделиться

Я нашел эту ссылку на встраивание Моно: http://www.mono-project.com/Embedding_Mono

Это обеспечивает то, что, кажется, довольно простой интерфейс для взаимодействия с блоками. Это могло быть привлекательной опцией, особенно если Вы хотите быть межплатформенные

0
ответ дан 28 November 2019 в 07:52
поделиться