3

我正在尝试创建一个 DLL 以包含我在 C++ .net 应用程序中定期使用的一组函数。我相信安排这些函数的最佳方式是在命名空间中,因为它们不引用特定的对象。

namespace MyNamespace
{
    int a();
    int b();
    int c();
}

DLL 编译正确,但是当我尝试在客户端解决方案中使用命名空间时,出现以下错误:

error C2871: 'MyNamespace' : a namespace with this name does not exist

但是,如果我将函数包装为类中的静态方法,我的客户端解决方案将按预期编译和运行:

namespace MyNamespace
{
    public ref class MyClass
    {
    public:
        static int a();
        static int b();
        static int c();
    }
}

我的假设是 ref 关键字正在对类执行某些操作以将其公开给客户端应用程序。如何使用命名空间而不是类创建托管/CRL/CLI/.net .DLL?

4

2 回答 2

1

只有 a 中的公共方法才能public ref class被其他托管代码看到和使用。您的第一个声明创建了不在此类中的函数。这通常不受 CLR 支持,方法必须存在于类内部。

C++/CLI 编译器仍然乐于编译您的代码,毕竟在 C++ 代码中具有这样的功能很常见。但它必须为函数中的代码找到一个合适的归宿,它创建了一个特殊的类作为归宿。它被命名为<Module>,您可以在生成的程序集上运行 ildasm.exe 时看到它。此类有一个故意不可用的名称,不能在标识符中使用尖括号。并且被标记为内部,因此它们在元数据浏览器中也不可见。您仍然可以链接这些函数,换句话说,您可以从其他 C++/CLI 源代码文件中调用它们。但不是来自其他托管语言,它们不使用链接器。

因此,使用您找到的解决方法,这是公开功能的好方法。

于 2013-06-12T11:55:38.570 回答
0

你不能。在 .NET 中,没有“免费”功能。一切都是类的方法。在您的情况下,静态类的静态方法,但仍然是类的方法。

于 2013-06-12T08:58:22.760 回答