是否可以使用DllImport来访问名称空间
本文关键字:空间 访问 可以使 DllImport 是否 | 更新日期: 2023-09-27 18:18:32
我刚刚创建了一个非托管的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的函数名。这样你就可以调用混乱的函数名。