1 Nhập một lớp từ c # dll vào ứng dụng c ++

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi cần nhập một dll được tạo trong c # từ c ++ Tất cả các ví dụ tôi tìm thấy nhập một hàm duy nhất từ ​​một dll, nhưng theo tôi biết, bạn không thể xuất một hàm duy nhất từ ​​c # mà không xuất toàn bộ lớp (mặc dù tôi là một chút của c # newbie)

Tôi đang sử dụng nút gyp để biên dịch nó (Tôi đang xây dựng mô-đun nút cho ứng dụng web của mình bằng v8)

Đây là mã c # của tôi:

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);
    }
}

Và đây là tệp tiêu đề c ++ của tôi:

#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. . import-directive-cpp "rel =" nofollow noreferrer "> viết mã COM . Hãy xem gói nuget UnmanagedExports, không sao cho các chức năng đơn giản như thế này.
2019-05-08 16: 47: 18Z
  • Trong trường hợp của bạn, bạn đang cố gắng tạo ứng dụng (.exe). Tôi không chắc đây thực sự là những gì bạn muốn làm. Thông thường người ta sẽ tạo một thư viện c # và xuất nó. Tôi cũng không thích COM. Tôi đã cung cấp cho bạn một ví dụ với gói CLR, những gì tôi thường sử dụng dịp này khi tôi cần loại chuyển đổi này.
    2019-05-08 16: 51: 29Z
  • 1 Câu trả lời                              1                         

    Tôi thường làm loại công cụ này bằng cách tạo Trình bao bọc C ++ CLR tĩnh Lib.

    Đây là những bước tôi thường sử dụng (mặc dù tôi không sử dụng nó thường xuyên):

    Dưới đây là ví dụ tối thiểu khi sử dụng Visual Studio:

    1. Tạo dự án thư viện C # .NET được quản lý

    Đặt tên cho nó là HelloLibManaged    với một tệp Hello.cs và nội dung sau:

    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");
            }
        }
    }
    

    Xây dựng lib này với x86 hoặc x64 , chỉ cần không có CPU

    2. Tạo một dự án lib tĩnh C ++ CLR mới trong cùng một giải pháp.    Hãy đặt tên cho nó là HelloLibCpp

    • Thêm một tham chiếu đến dự án HelloLibManaged thông qua Dự án- > Thêm tham chiếu

    • Xóa các tệp .h /.cpp đã tạo tự động khỏi Project và tạo 2 tệp này:

    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();
        }
    
    }
    

    Không thuộc tính dự án - > Chung chỉ định lib tĩnh. Trong Cài đặt bản dựng chỉ định x86 /x64 - sử dụng cùng loại bản dựng với bản dựng Được quản lý lib từ Bước 1.

    Bây giờ bạn có thể xây dựng dll và sử dụng nó trong các dự án C ++ không được quản lý khác của bạn.

    Đối với các công cụ nâng cao hơn, như kiểu trả về và phương thức có tham số bạn phải thực hiện Loại-Marshalling giữa mã được quản lý /không được quản lý. Có nhiều tài nguyên trực tuyến với nhiều thông tin hơn về Chuyển đổi loại giữa mã được quản lý /không được quản lý. Từ khóa: Marshẩy .

        
    0
    2019-05-08 16: 44: 22Z
    1. Cảm ơn! Tôi sẽ thử cái này. Bạn đang sử dụng trình biên dịch /IDE nào?
      2019-05-08 17: 54: 38Z
    2. Đối với ví dụ này VS 2017
      2019-05-08 19: 37: 18Z
    3. Tuyệt vời! Tôi đã dùng thử và nó cũng hoạt động, khi tìm kiếm Marshaling, tôi đã tìm thấy mô-đun nút edge.js, cho phép tôi sử dụng c # dll của mình trực tiếp từ js Cảm ơn sự giúp đỡ của bạn!
      2019-05-13 13: 24: 27Z
    nguồn đặt đây