在 C# 项目中引用 C++/CLI 类库(编译的 dll)

本文关键字:类库 编译 dll CLI 项目 引用 C++ | 更新日期: 2023-09-27 18:35:46

我有一个非常简单的C++类库,其中有两种帐户类型,称为"检查"和"储蓄"。 我已经构建了这个项目,并将其编译成一个名为"帐户"的.dll。我已经在我的 C# 控制台应用程序中引用了帐户.dll。 无济于事,我正在尝试分别使用静态类存款储蓄支票类中提取。 我没有看到这些函数显示在对象浏览器或智能感知中,当我尝试访问这些功能时,我无法构建它,否则当我注释掉对 mySavings .deposit(arg1,arg2)的调用时,我能够构建和运行...

知道我在这里做错了什么吗? 我经常引用来自其他项目和第三方的 .dll,但这是第一次引用 C# 项目中的C++ .dll。

C++类库

#pragma once
using namespace System;
namespace Accounts {
  public ref class Savings
  {
    public:
        unsigned accountNumber;
        double balance;
        static double deposit(Savings s, double amount)
        {
            s.balance += amount;
            return s.balance;
        }
  };
  public ref class Checking
  {
    public:
        unsigned accountNumber;
        double balance;
        static double withdraw(Checking c, double amount)
        {
            c.balance -= amount;
            return c.balance;
        }
  };
}

引用上述编译的动态链接库的 C# 控制台应用程序

using Accounts;
class Program
{
  static void Main(string[] args)
  {
    Savings mySavings = new Savings();  // works but object is empty
    mySavings.deposit(mySavings, 100);  // still breaks
  }
}

我收到以下错误:"Accounts.Savings "不包含"存款"的定义,并且找不到接受类型为"Accounts.Savings "的第一个参数的扩展方法"存款"(您是否缺少 using 指令或程序集引用?

任何帮助将不胜感激。

在 C# 项目中引用 C++/CLI 类库(编译的 dll)

你认为 C# 可以访问C++类...不能。 但是C++/CLI 可以创建 C# 可以使用的 .NET 类型。 但是,这些遵循 .NET 的规则,这些规则有时与 C++ 不同。

首先,您必须在 C++/CLI 代码中使用ref class(或ref structvalue classvalue struct):

public ref class Savings

然后,需要初始化 C# 引用以指向对象。 在 C# 中仅声明变量不足以构造对象默认值(不适用于引用类型,其中变量将被null或未初始化,不适用于值类型,其中内容将为全零或未初始化,没有调用构造函数)。

Savings mySavings = new Savings();

之后,你会发现 C++/CLI 无法引用 .NET 引用类型,除非通过跟踪句柄...所以而不是

Savings&

你需要

Savings% // tracking reference, but C# doesn't know what to do
         // with a function whose parameter is like this

Savings^ // tracking pointer, C# likes it fine, C++/CLI will need -> to access members

最后,从 C# 调用静态函数的语法是

Savings.deposit(mySavings, 100);
// ^^ class name, not object

但无论如何,这可能应该是一个非静态成员,对吧?