Как правильно связать оболочку c ++ / CLR с неуправляемой dll c ++ и использовать ее в программе на c # - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь создать ссылку на dll, скомпилированную как неуправляемый код c ++ из другой dll c ++, которая упаковывает полезный неуправляемый код и скомпилирована с помощью CLR. Затем я хочу использовать эту оболочку в приложении C #. Однако все попытки пока не увенчались успехом по разным причинам.

Я использую Visual Studio 2017 для этого проекта.

Я начинаю с создания проекта на c #. File->new->project->visual c#->console app (.NET Framework)

Затем я создаю свой проект на c ++ / clr, щелкнув правой кнопкой мыши по решению и выполнив: add->new project->visual c++->clr->clr empty project. Мне нужно, чтобы мой проект c ++ / clr был dll, поэтому я перехожу на properties->Configuration Properties->General->Configuration Type и устанавливаю значение Dynamic Library (.dll)

Теперь мне нужен мой проект C # для ссылки на этот проект, поэтому я щелкаю правой кнопкой мыши по своему проекту c # и перехожу на add->reference, затем я выбираю свой проект c ++ / clr (Я знаю, что до этого момента все правильно, потому что я могу вызывать свои функции c ++ / clr из проекта c # и получать желаемый результат. Проблема возникает, когда я продолжаю пытаться вызывать неуправляемый код.).

Теперь, когда у меня есть эта настройка, я могу создать свой неуправляемый проект c ++, поэтому я выполняю аналогичные шаги, но на этот раз я создаю пустой проект C ++ и снова изменяю свойства конфигурации на DLL. Затем я добавляю неуправляемый проект c ++ в качестве ссылки на проект c ++ / clr, щелкнув правой кнопкой мыши проект c ++ / clr и выбрав команду add->reference

Теперь у меня есть 3 проекта и ссылки, которые мне нужны, затем я могу начать добавлять свой код, чтобы добавить два файла в каждый проект c ++:

Я не думаю, что сам код особенно интересен для этого вопроса, но я все равно включаю его, чтобы любой мог быстро воспроизвести проблему. В неуправляемом проекте C ++ у меня есть заголовок, содержащий:

// UnmanagedHeader.h
#pragma once

__declspec(dllexport) void HelloDLL();

и в исходном файле:

#include "UnmanagedHeader.h"
#include <iostream>

void HelloDLL() { std::cout << "Hello from unmanaged dll!" << std::endl; }

Тогда в проекте c ++ / clr у меня есть заголовок, содержащий:

// Header.h
#pragma once

using namespace System;

namespace Project1
{
    public ref class Class1
    {
    public:
                // contruct this class
        Class1();
                // Call a function from the unmanaged project
        void UnmanagedWrap();
    };
}

и исходный файл, содержащий:

#include "Header.h"
#include "../Project2/UnmanagedHeader.h"
#include <iostream>

namespace Project1
{
    Class1::Class1() { std::cout << "Hello From Class1" << std::endl; }
    void Class1::UnmanagedWrap() { HelloDLL(); }
}

и, наконец, в моем проекте c # у меня есть один файл, содержащий:

using System;
using Project1;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Class1 c = new Class1();
            c.UnmanagedWrap();
            Console.ReadLine();
        }
    }
}

Все это прекрасно компилируется, но когда я запускаю приложение, я получаю ошибку времени выполнения:

System.IO.FileNotFoundException: «Не удалось загрузить файл или сборку« Project1.dll »или одну из ее зависимостей. Указанный модуль не найден. '

Project1.dll - это проект c ++ / clr, но я ожидаю, что проблема связана с тем, что мой неуправляемый c ++ dll настроен неправильно. Я знаю, что существует Project1.dll (c ++ / clr) и Project2.dll (неуправляемый c ++).

Может ли кто-нибудь объяснить мне, что мне нужно сделать, чтобы мой неуправляемый dll c ++ был совместим с проектами c ++ / clr и c #?

Обновление: что-то, что я только что попробовал, может помочь. Если я попытаюсь добавить ссылку из проекта c ++ / clr в неуправляемую dll-версию (не выбирая проект, а вместо этого выбирая встроенную dll и выбирая ее), я получить: Could not add a reference to "<path>/Project2.dll" as it is not of a type or version this project can use.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...