Импорт класса из ac # dll в приложение c ++ - PullRequest
0 голосов
/ 08 мая 2019

Мне нужно импортировать 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

1 Ответ

0 голосов
/ 08 мая 2019

Обычно я делаю такие вещи, создавая статический 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();
    }

}

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

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

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

...