在 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++类...不能。 但是C++/CLI 可以创建 C# 可以使用的 .NET 类型。 但是,这些遵循 .NET 的规则,这些规则有时与 C++ 不同。
首先,您必须在 C++/CLI 代码中使用ref class
(或ref struct
或value class
或value 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
但无论如何,这可能应该是一个非静态成员,对吧?