Предположим, что я пишу приложение на C++ и C#. Я хочу написать низкоуровневые части на C++ и написать логику высокого уровня в C#. Как загрузить сборку .NET из моей программы на C++ и начать вызов методов и доступ к свойствам моих классов C#?Как я могу назвать сборку .NET из C/C++?
ответ
[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-компонент.
Вы можете обернуть компонент .NET в COM-компоненте, что довольно просто с инструментами .NET, и вызвать его через COM.
Если части низкого уровня на C++, то обычно вы вызываете это из кода C#, передавая требуемые значения. Это должно работать стандартным образом, к которому вы, вероятно, привыкли. Например, вам нужно будет прочитать о сортировке.
Вы можете посмотреть этот blog, чтобы получить конкретные сведения.
Создайте свою сборку .NET как обычно, но обязательно отметьте класс ClassInterface (ClassInterfaceType.AutoDual) и убедитесь, что информация сборки SetAssemblyAtribute соответствует ComVisible (true).
Затем создайте COM обертку с Regasm:
Regasm MyDll.dll /tlb:mydll.tbl/ф: кодовой базы _code \ ClassLibraryForCom
обязательно использовать директиву/кодовой базы - это необходимо, если вы не собираетесь давать сборке сильное имя.
гр
Мейсон Bendixen предостерегает от использования ClassInterfaceType.AutoDual http://blogs.msdn.com/mbend/archive/2007/04/17/classinterfacetype-none-is-my-recommended-option-over-autodispatch-autodual .aspx – cwick 2008-09-19 23:06:18
Поскольку C# может импортировать стандартный экспорт C++, может быть проще загрузить вашу C++-dll внутри приложения C# вместо использования COM из C++.
См. Документацию по System.Runtime.InteropServices.DllImport.
Кроме того, здесь есть полный перечень типов Interop, что вы можете сделать между управляемым и неуправляемым кодом:
http://blogs.msdn.com/deeptanshuv/archive/2005/06/26/432870.aspx
В двух словах:
(а) с помощью COM-Interop
(б) Использование импорта/PInvoke (явные вызовы методов)
(с) IJW и MC++ приложения: MC++ & Приложения IJW могут свободно переходить друг к другу.
(d) Хостинг. Это редко, но CLR может быть размещен неуправляемым приложением, что означает, что среда выполнения вызывает кучу хостинговых обратных вызовов.
Если у вас есть как управляемый, так и неуправляемый код в вашем процессе, вы можете создать класс C++ с виртуальными функциями. Реализовать класс со смешанным режимом C++/CLI. Внесите реализацию в ваш код на C++, чтобы (высокоуровневую) реализацию можно было вызывать из вашего (низкоуровневого) кода на C++.
Вы должны действительно изучить C++/CLI. Это делает такие задачи почти тривиальными.
В противном случае вам придется создавать COM-обертки вокруг кода C#, а ваше приложение на C++ вызывает COM-обертки.
Я нашел эту ссылку на вложение Mono: http://www.mono-project.com/Embedding_Mono
Это обеспечивает то, что кажется довольно простой интерфейс для взаимодействия с узлами. Это может быть привлекательным вариантом, особенно если вы хотите быть кросс-платформенным
Я бы определенно исследовал C++/CLI для этого и избежал COM и всех сбоев регистрации, которые имеют тенденцию производить.
Какова мотивация использования C++? Если это просто стиль, то вы можете обнаружить, что можете писать все в C++/CLI. Если это производительность, то переключение между управляемым C++ и неуправляемым кодом происходит относительно прямо. Но это никогда не будет прозрачным. Вы не можете передать управляемый указатель на неуправляемый код сначала, не привязывая его, чтобы сборщик мусора не перемещал его, и, конечно, неуправляемый код не будет знать о ваших управляемых типах. Но управляемый (C++) код может знать о ваших неуправляемых типах.
Еще одна вещь, которую следует отметить, состоит в том, что сборки C++/CLI, которые включают неуправляемый код, будут специфическими для архитектуры. Вам понадобятся раздельные сборки для x86 и x64 (и IA64).
- 1. Как я могу назвать стандартную сборку .NET в SQL
- 2. Как я могу назвать веб-метод .NET?
- 3. Как я могу назвать сборку C++ в VS2008?
- 4. Как я могу назвать команду «net share» из моей программы?
- 5. Как я могу назвать .NET-форму из приложения MFC?
- 6. Как я могу назвать JFrame из класса?
- 7. как я могу назвать фрагмент из listadapter
- 8. Как я могу назвать получателя из JDBC?
- 9. Как я могу назвать __missing__ из dict
- 10. Как я могу назвать JsonResult из javascript?
- 11. Как я могу назвать 'super' из 'define_method'?
- 12. Как я могу назвать erlang из Python?
- 13. Как мне назвать свою сборку?
- 14. Как я могу назвать группу результатов в Regex? (.Net)
- 15. Как я могу назвать код .NET с Java?
- 16. Как я могу назвать java.util.Map?
- 17. Как я могу назвать Tuples?
- 18. Как я могу назвать Sub?
- 19. Как я могу назвать LocalFree()?
- 20. Как я могу назвать нить?
- 21. Как я могу назвать «System.UnicodeString.UpperCase»?
- 22. Gradle: как я могу назвать 'def' из импортированного скрипта?
- 23. Я не могу назвать массив из класса
- 24. Почему я не могу назвать сессию контроллера MVC .net?
- 25. Как преобразовать сборку «.Net» (язык C#) в сборку «non .Net»?
- 26. Как я могу назвать этот массив?
- 27. Как я могу назвать расширение веточки функции?
- 28. Как я могу назвать .NET из C++ как возможно не зависящим от платформы способом
- 29. Как я могу назвать файл .bowerrc?
- 30. Как я могу назвать подпроцесс в Идрисе?
Вот учебник, показывающий также часть C++: [Как вызвать управляемую DLL из собственного кода Visual C++ в Visual Studio.NET или в Visual Studio 2005] (http://support.microsoft.com/kb/ 828736) – 2012-08-12 08:58:10
Я бы никогда не использовал COM для этого. Это очень неудобно и неуклюже. Я бы экспортировал функцию в код C++, а в .NET использовал GetProcAddress(), чтобы найти эту точку входа и просто вызвать ее. Вы даже можете реализовать обратные вызовы из кода C++ в .NET с помощью делегата. (https://code.msdn.microsoft.com/windowsapps/Enumerate-top-level-9aa9d7c1) – Elmue 2015-02-11 17:55:20