2008-09-19 5 views
25

Предположим, что я пишу приложение на C++ и C#. Я хочу написать низкоуровневые части на C++ и написать логику высокого уровня в C#. Как загрузить сборку .NET из моей программы на C++ и начать вызов методов и доступ к свойствам моих классов C#?Как я могу назвать сборку .NET из C/C++?

ответ

12
[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-компонент.

+1

Вот учебник, показывающий также часть C++: [Как вызвать управляемую DLL из собственного кода Visual C++ в Visual Studio.NET или в Visual Studio 2005] (http://support.microsoft.com/kb/ 828736) – 2012-08-12 08:58:10

+0

Я бы никогда не использовал COM для этого. Это очень неудобно и неуклюже. Я бы экспортировал функцию в код C++, а в .NET использовал GetProcAddress(), чтобы найти эту точку входа и просто вызвать ее. Вы даже можете реализовать обратные вызовы из кода C++ в .NET с помощью делегата. (https://code.msdn.microsoft.com/windowsapps/Enumerate-top-level-9aa9d7c1) – Elmue 2015-02-11 17:55:20

0

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

0

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

Вы можете посмотреть этот blog, чтобы получить конкретные сведения.

0

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

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

Regasm MyDll.dll /tlb:mydll.tbl/ф: кодовой базы _code \ ClassLibraryForCom

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

гр

+0

Мейсон 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

0

Поскольку 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 может быть размещен неуправляемым приложением, что означает, что среда выполнения вызывает кучу хостинговых обратных вызовов.

0

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

13

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

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

0

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

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

4

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

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

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

Смежные вопросы