如何正确地将c ++ / CLR包装器链接到未管理的c ++ dll并在c#程序中使用它

时间:2019-06-09 12:28:34

标签: c# c++ visual-studio dll clr

我正在尝试从另一个包装有用的非托管代码并使用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

,将非托管c ++项目添加为对c ++ / clr项目的引用。

现在我有了我的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.

0 个答案:

没有答案