我刚刚创建了一个非托管C++ DLL,并尝试在C#应用程序中使用DllImport来访问函数调用。(有多个头文件、多个命名空间、多个类文件)。当我尝试调用函数DllImport时,它说找不到入口点,我不禁觉得这与命名空间有关。我如何使用它们唯一的命名空间来调用我的函数呢?谢谢。
v7pvogib1#
如果要检查函数的导出名称,可以用途:
dumpbin /exports my_native_lib.dll
如果它不显示任何导出,则函数的导出方式有问题,我们需要更多代码。
sg3maiej2#
DllImport适用于“全局”C函数,而不是C类-对于C类,您必须为所需的函数创建C Package 。请参见:using a class defined in a c++ dll in c# code
fxnxkyjh3#
你可以使用dependency walker来查看任何dll的导出函数名。这样你就可以调用损坏的函数名。
xuo3flqw4#
答案是肯定的在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++包含文件是:名称空间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的导出函数名。2这样你就可以调用损坏的函数名。
4条答案
按热度按时间v7pvogib1#
如果要检查函数的导出名称,可以用途:
如果它不显示任何导出,则函数的导出方式有问题,我们需要更多代码。
sg3maiej2#
DllImport适用于“全局”C函数,而不是C类-对于C类,您必须为所需的函数创建C Package 。请参见:using a class defined in a c++ dll in c# code
fxnxkyjh3#
你可以使用dependency walker来查看任何dll的导出函数名。这样你就可以调用损坏的函数名。
xuo3flqw4#
答案是肯定的在VS 2022,我没有检查早期版本。对不起,如果这是迟到。
我在C#中使用了这个构造来访问命名空间中类的公共静态方法。
}
参数EntryPoint =“....”指定了损坏的方法调用。
C++包含文件是:
名称空间SimpleNS {
}
C++代码为:
}
你可以使用依赖步行者来查看任何dll的导出函数名。2这样你就可以调用损坏的函数名。