我正在尝试从另一个包装有用的非托管代码并使用CLR编译的c ++ dll链接到编译为非托管c ++代码的dll。然后,我想在c#应用程序中使用该包装器。 但是,到目前为止,由于种种原因,所有尝试都以失败告终。
我正在为此项目使用Visual Studio 2017。
我首先创建一个c#项目。 File->new->project->visual c#->console app (.NET Framework)
然后我通过右键单击解决方案并执行add->new project->visual c++->clr->clr empty project
来创建我的c ++ / clr项目。
我需要我的c ++ / clr项目是一个dll,因此我转到properties->Configuration Properties->General->Configuration Type
并将值设置为Dynamic Library (.dll)
现在,我需要C#项目来引用此项目,因此我右键单击c#项目并转到add->reference
,然后选择c ++ / clr项目
(我知道到目前为止一切都是正确的,因为我可以从c#项目中调用c ++ / clr函数并获得所需的输出。当我继续尝试调用非托管代码时,问题就来了。)
现在,我已经完成了设置,我可以创建我的非托管c ++项目,所以我遵循类似的步骤,但是这次我创建了一个C ++空项目,然后再次将配置属性更改为DLL。然后,通过右键单击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 ++)也存在。
有人可以向我解释我的非托管c ++ dll与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.