如何使用命名空间但没有类创建C ++ .net .DLL

时间:2013-06-12 08:45:08

标签: dll c++-cli

我正在尝试创建一个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?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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