В списке рассылки контроллера Ryu пользователь по имени IWAMOTO сказал мне, что мои значения hard_timeout были слишком большими для упаковки структуры (2 часа - 7200 секунд, я не знаю, где моя голова, чтобы найти 432000 хаха), после сокращения hard_timeout до 7200 секунд все работало просто отлично.
Всегда проверяйте размер значений, которые вы пытаетесь отправить в канал данных, посмотрите, не превышает ли он 65535.
[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-компонент.
Необходимо действительно изучить C++ / CLI. Это делает задачи как это почти тривиальными.
Иначе, необходимо будет генерировать обертки COM вокруг кода C# и иметь вызов приложения C++ обертки COM.
Я определенно исследовал бы C++ / CLI для этого и избежал бы COM и всех регистрационных стычек, который имеет тенденцию производить.
, Какова мотивация для использования C++? Если это - просто стиль тогда, Вы могли бы найти, что можно записать все в C++ / CLI. Если это - производительность, затем звоня назад и вперед между управляемым С++, и неуправляемый код является относительно прямым. Но это никогда не будет прозрачным. Вы не можете передать управляемый указатель неуправляемому коду сначала, не прикрепляя его так, чтобы сборщик "мусора" не перемещал его, и конечно неуправляемый код не будет знать о Ваших управляемых типах. Но управляемый (C++) код может знать о Ваших неуправляемых типах.
Еще одна вещь отметить состоит в том, что C++ / блоки CLI, которые включают неуправляемый код, будет архитектурно-зависимым. Вам будет нужно, разделяет сборки для x86 и x64 (и IA64).
Можно обернуть компонент.NET в COM-компонент - который довольно легок с инструментами.NET - и назовите его через COM.
Если низкоуровневые части в в C++ тогда обычно, который Вы называете этим от передачи кода C# в значениях, которые необходимы. Это должно работать стандартным способом, к которому Вы, вероятно, приучены. Необходимо будет читать при маршалинге, например.
Вы могли посмотреть на этот блог для получения некоторых конкретных деталей.
Создайте свой блок.NET как нормальный, но убеждаться отметить класс с ClassInterface (ClassInterfaceType. AutoDual) и быть уверенным информация о блоке SetAssemblyAtribute (верному) ComVisible.
Затем создайте обертку COM с REGASM:
regasm mydll.dll/tlb:mydll.tbl / кодовая база f: _ code\ClassLibraryForCom
убедиться использовать / директиву кодовой базы - необходимо, если Вы не собираетесь давать блоку строгое имя.
армированный пластик
Так как 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 может быть размещен неуправляемым приложением, что означает, что время выполнения вызывает набор хостинга обратных вызовов.
Если можно было и справиться и неуправляемый код в процессе, можно создать класс C++ с виртуальными функциями. Реализуйте класс со смешанным C++ режима / CLI. Введите реализацию к своему коду C++, так, чтобы (высокоуровневую) реализацию можно было назвать от Вашего кода C++ (низкого уровня).
Я нашел эту ссылку на встраивание Моно: http://www.mono-project.com/Embedding_Mono
Это обеспечивает то, что, кажется, довольно простой интерфейс для взаимодействия с блоками. Это могло быть привлекательной опцией, особенно если Вы хотите быть межплатформенные