Подтвердить что ты не робот

Как я могу назвать сборку .NET из C/С++?

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

4b9b3361

Ответ 1

[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 добавит необходимые записи в реестре, чтобы ваш компонент .NET мог рассматриваться как COM-компонент. После этого вы можете вызвать свой компонент .NET на С++ так же, как любой другой COM-компонент.

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Затем создайте COM-обертку с помощью REGASM:

regasm mydll.dll/tlb:mydll.tbl/codebase f: _code\ClassLibraryForCom

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

гр

Ответ 7

Так как С# может импортировать стандартный экспорт С++, может быть проще загрузить вашу С++-dll внутри приложения С# вместо использования COM из С++.

См. документацию для System.Runtime.InteropServices.DllImport.

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

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

В двух словах:

(a) Использование COM-Interop

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

(c) Приложения IJW и MС++: приложения MС++ и IJW могут свободно переходить друг к другу.

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

Ответ 8

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

Ответ 9

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

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