c# - 如何正确地将 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.
解决方案
推荐阅读
- firebase - firebase 安全规则仅允许对我的文档的某些特定字段/属性的写入权限
- python-3.x - 我如何暂停一个线程,直到另一个线程停止它在 python 中的操作?
- google-cloud-sdk - 错误gcloud执行,重新安装后
- sql - 如何请求在房间中显示最新消息
- vue.js - Vue路由器无法识别View的子组件
- javascript - 没有参数的 Javasript 数组函数
- javascript - 谷歌地图 - addGeoJson 不适用于我的文件
- pandas - 更改图例的位置和条形图的大小
- c# - 为什么我在尝试使用 AddonSuccessListener 时收到 InvalidCastException?
- webhooks - FusionAuth:通过“设置密码”电子邮件确认时未触发 Webhook user.email.verified