【问题标题】:Reference C++/CLI class library (compiled dll) in C# project在 C# 项目中引用 C++/CLI 类库(编译好的 dll)
【发布时间】:2014-12-31 00:32:10
【问题描述】:

我有一个非常简单的 C++ 类库,其中包含两种帐户类型,称为 CheckingSavings。我已经构建了这个项目并将其编译成一个名为 Accounts 的 .dll。我在我的 C# 控制台应用程序中引用了 Accounts.dll。无济于事,我尝试分别从 SavingsChecking 类中使用静态类 depositwithdraw .我没有在对象浏览器或 Intellisense 中看到这些函数,并且当我尝试访问这些函数时无法构建它,否则当我注释掉对 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”不包含“deposit”的定义,并且找不到接受“Accounts.Savings”类型的第一个参数的扩展方法“deposit”(您是否缺少使用指令还是程序集引用?)

任何帮助将不胜感激。

【问题讨论】:

    标签: c# dll reference c++-cli


    【解决方案1】:

    您认为 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
    

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

    【讨论】:

    • 好的,Ben,这有帮助。现在我可以看到 accountNumber 和 balance 但我仍然看不到我的功能。我必须从类中删除 & 才能编译它,但我错过了任何可以让函数被看到的东西......我已经更新了上面的代码。
    • @user2146538:函数参数需要Savings^,使用时需要->。这是因为 C# 变量,就像在 Java 中一样,实际上是指针。 (仅适用于引用类型,但有不变量时不应使用值类型,仅适用于简单数据容器)
    • 感谢您的解释。从来没有见过这样的东西! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多