是否可以使用DllImport来访问名称空间

Is it possible to use DllImport to access namespaces?

本文关键字:空间 访问 可以使 DllImport 是否      更新时间:2023-10-16

我刚刚创建了一个非托管的c++ DLL,我试图在我的c#应用程序中使用DllImport来访问函数调用。然而,每个函数都属于自己的命名空间(有多个头文件、多个命名空间、多个类文件)。当我尝试调用DllImport函数时,它说找不到入口点,我不禁觉得这与名称空间有关。如何使用唯一的名称空间调用函数?谢谢。

如果您想检查导出的函数名,您可以使用:

dumpbin /exports my_native_lib.dll

如果它没有显示任何导出,则说明函数导出的方式有问题,我们需要更多的代码。

DllImport将用于'全局' C函数,而不是c++类-对于c++类,您必须为所需的函数创建C包装器。看到的:在c#代码中使用c++ DLL中定义的类

你可以使用dependency walker来查看任何dll的导出函数名。这样你就可以调用混乱的函数名。

在VS 2022中答案是肯定的,我没有检查更早的版本。对不起,我来晚了。

我在c#中使用这个结构来访问一个命名空间内的类的公共静态方法。

namespace LifetimeCallsCs {
internal sealed class NativeSimple {
    private NativeSimple() { }
    [DllImport("CppTransforms.dll", EntryPoint = "?LifetimeTransformCreate@LifetimeTransform@SimpleNS@@SAXPEAPEAX@Z", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, SetLastError = false)]
    public static unsafe extern void* LifetimeTransformCreate(void** handle);
    [DllImport("CppTransforms.dll", EntryPoint = "?LifetimeTransformDelete@LifetimeTransform@SimpleNS@@SAXPEAX@Z", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, SetLastError = false)]
    public static unsafe extern void LifetimeTransformDelete([In] IntPtr handle);
}

}

参数EntryPoint = "...."指定了混乱的方法调用

c++的include文件是:

SimpleNS

名称空间{

class LifetimeTransform
{
public:
    static void __declspec(dllexport) _cdecl LifetimeTransformCreate(void** handle);
    static void __declspec(dllexport) _cdecl LifetimeTransformDelete(void* handle);
};

}

c++代码是:
namespace SimpleNS {
void LifetimeTransform::LifetimeTransformCreate(void** handle) {
    *handle = new SimpleNS::LifetimeTransformImp();
}
void LifetimeTransform::LifetimeTransformDelete(void* handle) {
    if (handle != nullptr)
        delete (SimpleNS::LifetimeTransformImp*)handle;
}

}

你可以使用依赖项跟踪器来查看导出的任何dll的函数名。这样你就可以调用混乱的函数名。