Вопрос по c#, c++, .net – Как вызвать сборку .NET из C / C ++?

25

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

Ваш Ответ

9   ответов
0

что довольно просто с помощью инструментов .NET, и вызвать его через COM.

4

ех проблем с регистрацией, которые имеют тенденцию вызывать.

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

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

0

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

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

0

так и неуправляемый код в своем процессе, вы можете создать класс C ++ с виртуальными функциями. Реализуйте класс в смешанном режиме C ++ / CLI. Внедрите реализацию в ваш код 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()
    {
    }
}

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

Error: User Rate Limit Exceededcode.msdn.microsoft.com/windowsapps/…)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

может быть проще загрузить вашу DLL C ++ внутри приложения C # вместо использования COM из C ++.

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

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

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

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

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

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

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

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

0

http://www.mono-project.com/Embedding_Mono

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

13

ачи почти тривиальными.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

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

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

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

Р.П.

Error: User Rate Limit Exceededblogs.msdn.com/mbend/archive/2007/04/17/… cwick

Похожие вопросы