首页 > 解决方案 > 如何正确地将 c++/CLR 包装器链接到未管理的 c++ dll 并在 ac# 程序中使用它

问题描述

我正在尝试从另一个包装有用的非托管代码并使用 CLR 编译的 c++ dll 链接到编译为非托管 c++ 代码的 dll。然后我想在 ac# 应用程序中使用该包装器。然而,到目前为止,所有尝试都因各种原因而失败。

我正在为这个项目使用 Visual Studio 2017。

我首先创建 ac# 项目。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++/clr 项目并继续添加非托管 c++ 项目作为对 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.

标签: c#c++visual-studiodllclr

解决方案


推荐阅读