在本机 C++ 项目中导入 C# dll 库

Posted

技术标签:

【中文标题】在本机 C++ 项目中导入 C# dll 库【英文标题】:Importing C# dll library within native C++ Project 【发布时间】:2016-03-18 12:03:01 【问题描述】:

我正在尝试将 C# dll 库包含到本机 C++ 控制台应用程序中。我正在使用这篇文章: https://support.microsoft.com/en-us/kb/828736#bookmark-7

但是这篇文章是为 Visual Studio 2015 编写的,而我使用的是 Visual Studio 2015。

首先我在 *** 上检查了几个答案,但这些问题都不是我想要的。

最接近我的问题在这里: C# library to native C++ application

所以,我创建了一个 C# 库项目,其中包含以下代码:

namespace Testing_Library


    // Interface declaration
    public interface iCalculator
    
        int Add(int number1, int number2);
    

    public class ManagedClass:iCalculator
    
        public int Add(int number1, int number2)
        
            return number1 + number2;
        
    

然后我将项目编译为dll文件,然后我通过RegAsm.exe注册了dll文件。现在我有两个输出文件:

Testing_Library.dll

Testing_Library.tlb

我还创建了本机 C++ Windows 控制台应用程序项目。在这个项目中,我有一个带有以下代码的 .cpp 文件:

// Import the type library.
#import "..\Testing_Library\bin\Debug\Testing_Library.tlb" raw_interfaces_only

using namespace std;
using namespace Testing_Library;

void main()

    // Initialize COM.
    HRESULT hr = CoInitialize(NULL);

    // Create the interface pointer.
    iCalculatorPtr pICalc(__uuidof(ManagedClass));

    long lResult = 0;

    // Call the Add method.
    pICalc->Add(5, 10, &lResult);

    wprintf(L"The result is %d", lResult);

    // Uninitialize COM.
    CoUninitialize();


当我尝试运行该项目时,我收到以下错误屏幕:

目前我不知道为什么我会收到此错误 Windows 并且我无法在 Internet 上找到信息。请你帮助我好吗? 在这里您可以找到所有项目的完整解决方案: Onedrive folder

我目前正在尝试编译和运行:

Test_me

Testing_Library

【问题讨论】:

不能调试应用吗? 我可以,但是我是 C# 和 COM 的新手,我目前正在尝试学习它们,我不会在那里找到很多有用的信息,至少对我来说是这样。 CoInitialize 将 S_OK 返回到 HRESULT,这没问题,然后应用程序在接口指针上崩溃。最后一个屏幕给了我这个: pICalc.m_pInterface was nullptr 我还可以在微软论坛上找到这个:这是#import生成的代码的标准行为。每当接口方法返回失败 HRESULT 时,它都会将错误转换为异常。但就我而言,结果还可以 这一行执行后会发生什么? iCalculatorPtr pICalc(__uuidof(ManagedClass));你有实例吗?我不是 C++ 专家,但它看起来好像和 C# 的空引用异常的等价物正在发生。例如。 pICalc 为空 什么都没有发生,因为程序在该行发生异常,并且无法创建接口指针。也许我需要了解为什么程序无法创建指向 iCalculator 类的指针。 这样的代码只有在你一切正确的情况下才有效,错误处理在 COM 代码中永远不是可选的。就像你不能忽略 Add() 的返回值一样。如果您不知道如何单步执行 iCalculatorPtr 构造函数,则使用 try catch (_com_error &ex) ... 包装此代码,以便您可以诊断 ex。并且确实在文档上花费最少的时间,试错编码有很多错误,我们的试验。 【参考方案1】:

请将项目属性中的平台目标更改为 .NET 程序集的 x86。

【讨论】:

以上是关于在本机 C++ 项目中导入 C# dll 库的主要内容,如果未能解决你的问题,请参考以下文章

本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

C# 访问本机 C++ DLL

使用Adobe Air构建Android本机库

本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃

将静态本机库链接到托管 C++ 项目会在

将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是啥?