Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建C++。net.DLL,具有命名空间但没有类_Dll_C++ Cli - Fatal编程技术网

如何创建C++。net.DLL,具有命名空间但没有类

如何创建C++。net.DLL,具有命名空间但没有类,dll,c++-cli,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 ex

我试图创建一个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?

您不能。在.NET中,没有“免费”函数。一切都是一个类的方法。在您的例子中,静态类的静态方法,但仍然是类的方法。

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

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


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

您试图使用哪种语言来使用此DLL?C++/CLI也可以?我肯定会将它与C++/CLI一起使用,并希望它也能与visual basic一起使用,在较小程度上与C#一起使用。可以在C++/CLI中编译自由函数,因此它比您所说的更复杂。我相信编译器会将这些函数放在一个隐式创建的类中,该类具有一个无法描述的名称。