C# 与非托管 C++ 互操作性的延续传奇

2024-02-02

经过一天的头撞墙之后,我恳求帮助:

我有一个非托管 C++ 项目,它被编译为 DLL。我们就这样称呼它吧光热发电项目。它目前在非托管环境中运行。另外,我还创建了一个WPF项目,该项目将被称为WPF项目。该项目是一个简单且目前几乎是空的项目。它包含一个窗口,我希望它使用项目 1 中的代码。为此,我创建了一个 CLR C++ 项目,该项目应称为互操作项目并且也被编译为DLL。

为了简单起见,我将附上一些我已归结为基础的基本测试代码。

CPP项目有以下两个测试文件:

tester.h

#pragma once
extern "C" class __declspec(dllexport) NativeTester
{
public:
    void NativeTest();
};

测试程序.cpp

#include "tester.h"
    void NativeTester::NativeTest()
    {
        int i = 0;
    }

Interop 项目有以下文件:

互操作库.h

#pragma once
#include <tester.h>
using namespace System;
namespace InteropLib {
    public ref class InteropProject
    {
    public:
        static void Test()
        {
            NativeTester nativeTester;
            nativeTester.NativeTest();
        }
    };
}

最后,WPF 项目有一个引用 Interop 项目的单一窗口:

MainWindow.xaml.cs

using System;
using System.Windows;
using InteropLib;
namespace AppGUI
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            InteropProject.Test();
        }
    }
}

XAML 本身有一个空窗口(默认创建)。

当我尝试运行 WPF 项目时,出现以下错误:

System.Windows.Markup.XamlParseException:“对与指定绑定约束匹配的类型“AppGUI.MainWindow”的构造函数的调用引发了异常。”行号“3”和行位置“9”。 ---> System.IO.FileNotFoundException:无法加载文件或程序集“InteropLib.dll”或其依赖项之一。指定的模块无法找到。
在 AppGUI.MainWindow..ctor()

有趣的是,如果我不从 CPP 项目导出该类,则不会收到此错误。说吧,如果我改变tester.h to:

#pragma once
class NativeTester
{
public:
    void NativeTest()
    {
        int i = 0;
    }
};

但是,在这种情况下,我无法使用更复杂的类。如果我像以前一样将实现移动到 cpp 文件,由于我没有导出代码,我会遇到未解决的链接错误。我想要实际使用的 C++ 代码很大,有很多类,并且是面向对象的,所以我不能将所有实现都移到 h 文件中。

请帮助我理解这个可怕的错误,我一直在尝试解决但没有成功。

Thanks.


这从一开始就出错了,你的 tester.h 文件不正确。当您构建测试器项目时,该类应该仅具有 __declspec(dllexport) 属性。任何other使用 DLL 的项目必须看到具有 __declspec(dllimport) 属性的类。通过使用 tester.h 中的宏开始修复此问题:

#undef EXPORTED
#ifdef BUILDING_DLL
#   define EXPORTED __declspec(dllexport)
#else
#   define EXPORTED __declspec(dllimport)
#endif

class EXPORTED NativeTester {
    // etc..
};

在您的测试器项目中,使用 C/C++、预处理器、预处理器定义并添加 BUILDING_DLL。

接下来的事情是确保 DLL 存储在正确的目录中。这就是异常所抱怨的,它找不到 DLL。 C++ 项目的构建目录是 Debug,但 WPF 项目的构建目录是 bin\Debug。通过更改常规 + 输出目录设置来修复此问题,使其$(SolutionDir)$bin\(ConfigurationName).

生成 C++ 项目并验证是否可以在解决方案的 bin\Debug 目录中找到 DLL。并检查您是否还有 .lib 文件,构建 C++/CLI 项目时需要该文件。作为额外的验证步骤,从 Visual Studio 命令提示符运行 Dumpbin.exe /exports foo.dll 并检查您是否确实看到导出的类。

接下来的 C++/CLI 项目,您需要以相同的方式更改输出目录设置。将 .lib 文件添加到链接器的“附加依赖项”属性中。如果您跳过该步骤,您将得到您所讨论的那种链接器错误。构建它并验证您是否再次在正确的 bin\Debug 目录中获得了 DLL。

对发布配置重复这些更改。

设置项目依赖,WPF项目依赖C++/CLI项目。 C++/CLI 项目依赖于 C++ 项目。这确保了项目按照正确的顺序构建。

您现在应该可以很好地在 WPF 项目中使用这些 DLL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 与非托管 C++ 互操作性的延续传奇 的相关文章

  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • Objective C HTML 转义/unescape

    想知道是否有一种简单的方法可以在 Objective C 中执行简单的 HTML 转义 unescape 我想要的是这样的伪代码 NSString string lt span gt Foo lt span gt string string
  • pandas read_csv 修复列以读取数据中带有换行符的数据

    使用 pandas 读取大型制表符分隔文件 df pd read csv file path sep t encoding latin 1 dtype str keep default na False na values 问题是有 200
  • python yield 和 stopiteration 在一个循环中?

    我有一个生成器 我想在其中向实际内容添加初始值和最终值 如下所示 any generic queue where i would like to get something from q Queue def gen header somet
  • 如何将 Yii 1.x 升级到 Yii 2.0?

    如何将 Yii 1 x 版本升级到 Yii 2 0 最新版本 我正在使用一个Ubuntu https en wikipedia org wiki Ubuntu 28operating system 29操作系统 将我的旧 Yii 更新到新
  • 如何正确连接Bitbucket和Jenkins

    大约 1 周以来 Bitbucket 没有 向我的 Jenkins 服务器发送请求 我已经将其全部设置如下 Endpoint http username apitoken jenkinshost username Jenkins 中的用户名
  • Facebook 登录 CallbackManager FacebookCallback 未调用?

    我尝试使用 LoginButton 登录 但未调用登录回调 LoginButton 在片段中 FacebookSdk sdkInitialize在Application onCreate中被调用 登录完成后不会调用任何回调 这是代码 活动
  • 在 WPF 中以编程方式创建 ControlTemplate

    如何以编程方式设置按钮的模板 Polygon buttonPolygon new Polygon buttonPolygon Points buttonPointCollection buttonPolygon Stroke Brushes
  • Apache Spark 与 Python:错误

    Spark 新手 下载一切正常 但当我运行 pyspark 时 出现以下错误 Type help copyright credits or license for more information Using Spark s default
  • 具有多个应用程序的 Django 打包项目

    我正在尝试打包我的 Django 项目 但没有成功 我的项目如下所示 dsbg manage py dsbg init py urls py wsgi py app1 init py models py views py urls py a
  • ASP.Net应用程序的安全部署[重复]

    这个问题在这里已经有答案了 可能的重复 如何以零停机时间部署 ASP NET 应用程序 https stackoverflow com questions 148084 how to deploy an asp net applicatio
  • unique_ptr 提升等效吗?

    boost 库中是否有 C 1x 的 std unique ptr 的等效类 我正在寻找的行为是能够拥有一个异常安全的工厂函数 就像这样 std unique ptr create base return std unique ptr ne
  • 类似 Prezi 的网络界面。 Flash 还是 HTML5?

    我想编写一个用户体验类似于 Prezi com 的 Web 界面 为此目的最好的技术是什么 项目要求 快速实施 这是一个演示 我希望有一个粗略的估计 大量数据 需要动态内容加载 卸载 我的自然选择是 Flash 和 HTML5 Prezi
  • Microsoft JScript 运行时错误:无法设置属性“control”的值:对象为 null 或未定义

    I am Developing a web application by using ASP NET 3 5 jQuery and RadAjax Telerik Control I get Error Messages when page
  • Javascript 将 onclick 事件附加到所有链接

    我想在网站上的每个链接上附加一个函数来更改参数 如果没有 jQuery 我该如何做到这一点 如何遍历每个链接 可能是 DOM 项 并调用它们的函数 奇怪的是没有人提供使用事件冒泡的替代解决方案 function callback e var
  • Flask - 无法使用其他文件中的 Flask 和 Flask-mail 实例

    我目前正在使用 Flask 构建一个应用程序 我正在努力访问 Flask 实例 app 以及 Flask mail 实例 mail 下面是我的项目的样子 my project application init py admin init p
  • SWT 复合 - 重绘问题

    我有一个复合元素 最初有一个标签 现在 我对其 标签 调用 dispose 并在同一容器 复合榆树 中创建另一个标签 但我没有看到新文本 这让我想到如何在复合材料上启用重绘 以便新标签 或我可能创建的任何其他组件 将代替旧标签进行渲染 这是
  • 为什么要使用 String.Equals 而不是 == ? [复制]

    这个问题在这里已经有答案了 我最近接触到了一个大型代码库 并注意到所有字符串比较都是使用String Equals 代替 您认为这是什么原因 很可能大部分开发人员都具有 Java 背景 其中使用 比较字符串是错误的并且不起作用 在 C 中
  • Spring Boot 消耗过多 RAM

    我在 Spring Boot 中创建了一些服务 我有 11 个 fat jar 并将它们部署在 docker 容器中 我怀疑每个 jar 都消耗了 1 到 1 5 GB 的 RAM 而没有任何使用 我通过运行以下命令来检查 RAM dock
  • EL 和协变返回类型

    我有这些课程 public abstract class Unit public abstract UnitType getType public class Item extends Unit protected ItemType typ
  • C# 与非托管 C++ 互操作性的延续传奇

    经过一天的头撞墙之后 我恳求帮助 我有一个非托管 C 项目 它被编译为 DLL 我们就这样称呼它吧光热发电项目 它目前在非托管环境中运行 另外 我还创建了一个WPF项目 该项目将被称为WPF项目 该项目是一个简单且目前几乎是空的项目 它包含