1 Вопрос: Импорт класса из dll c # в приложение c ++

вопрос создан в Wed, May 8, 2019 12:00 AM

Мне нужно импортировать DLL, сделанные в C # из C ++ Все примеры, которые я нашел, импортируют одну функцию из dll, но, насколько я знаю, вы не можете экспортировать одну функцию из c # без экспорта всего класса (хотя я немного новичок в c #)

Я использую node gyp для его компиляции (я создаю модуль node для моего веб-приложения с использованием v8)

Вот мой код на C #:

using System;
using System.IO;
using System.Runtime.InteropServices;

[ComVisible(true)]
public class Hello 
{
    public static void Main() 
    {
        Console.WriteLine("Hello World!");
        string createText = "Hello Fucker" + Environment.NewLine;
        File.WriteAllText(".\\asd.txt", createText);
    }
}

И это мой заголовочный файл c ++:

#ifndef ASDLIB_H
#define ASDLIB_H
#define ASD_IMPORT __declspec(dllimport)
#define STDCALL __stdcall

class ASD_IMPORT Hello{
    public:
         STDCALL static void ASD_IMPORT Main();
};

#endif // ASDLIB_H
    
0
  1. Для использования класса [ComVisible] C # требуется написание COM-кода . Взгляните на пакет nuget UnmanagedExports, хорошо для простых функций, подобных этой.
    2019-05-08 16: 47: 18Z
  2. В вашем случае вы пытаетесь экспортировать приложение (.exe). Я не уверен, что это действительно то, что вы хотите сделать. Обычно можно создать библиотеку c # и экспортировать ее. Я также не люблю COM. Я предоставил вам пример обтекания CLR, который я обычно использую иногда, когда мне нужно такое преобразование.
    2019-05-08 16: 51: 29Z
1 ответ                              1                         

Обычно я делаю такие вещи, создавая статический C ++ CLR Wrapper Lib.

Это те шаги, которые я обычно использую (хотя я использую их не часто):

Вот минимальный пример с использованием Visual Studio:

1. Создать управляемый проект библиотеки C # .NET

Назовите его HelloLibManaged    с одним файлом Hello.cs и следующим содержанием:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloLibManaged
{
    public class Hello
    {
        public void Print()
        {
            System.Console.WriteLine("Hello from Managed Lib");
        }
    }
}

Создайте эту библиотеку с x86 или x64 , просто не подключайте процессор

2. Создайте новый C ++ CLR статический проект lib в том же решении.    Давайте назовем это HelloLibCpp

  • Добавьте ссылку на проект HelloLibManaged через Project-> Добавить ссылку

  • Удалите автоматически созданные существующие файлы .h /.cpp из Project и создайте эти 2 файла:

HelloUnmanaged.h

#pragma once

namespace hello_managed {

    class Hello
    {
    public:
        void Print();
    };
}

и р>

HelloUnmanaged.cpp

#include "HelloUnmanaged.h"

namespace hello_managed
{

    void Hello::Print()
    {
        HelloLibManaged::Hello^ hello = gcnew HelloLibManaged::Hello();
        hello->Print();
    }

}

Отменить свойства проекта - > Общие уточняйте статические lib. В настройках сборки укажите x86 /x64 - используйте тот же тип сборки, что и для сборки Managed lib из шага 1.

Теперь вы можете собрать dll и использовать ее в других неуправляемых проектах C ++.

Для более сложных вещей, таких как возвращаемые типы и методы с параметрами, вы должны выполнить Type-Marshalling между управляемым /неуправляемым кодом. Есть много ресурсов онлайн с дополнительной информацией о Преобразовании типов между управляемым /неуправляемым кодом. Ключевое слово: Маршалинг .

    
0
2019-05-08 16: 44: 22Z
  1. Спасибо! Я попробую это. Какой компилятор /IDE вы используете?
    2019-05-08 17: 54: 38Z
  2. Для этого примера VS 2017
    2019-05-08 19: 37: 18Z
  3. Круто! Я попробовал это, и это сработало. Кроме того, в поисках Marshaling я наткнулся на модуль узла edge.js, который позволил бы мне использовать мой c # dll непосредственно из js. Спасибо за вашу помощь!
    2019-05-13 13: 24: 27Z
источник размещен Вот