Я пытаюсь создать ссылку на 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.