是否可以使用DllImport来访问名称空间
Is it possible to use DllImport to access namespaces?
我刚刚创建了一个非托管的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的函数名。这样你就可以调用混乱的函数名。
相关文章:
- VS2017 是否更改了 C++ 中访问 C# 命名空间的方式?
- 通过引用访问矢量元素是否会降低C++的空间复杂性?
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- C++使用其他命名空间中的符号,而不使它们可从外部访问
- 访问向量字段的键 - 枚举类还是命名空间中的枚举?
- 将typeID转换为静态成员访问(C )的命名空间
- 如何使客户端无法访问命名空间的函数
- 从另一个命名空间访问标准命名空间数据成员
- 无法明确访问名称空间范围朋友
- 如何访问其他 .cc 文件中命名空间中定义的函数
- 是否访问用户或内核空间
- 使用命名空间和模板类访问变量
- 从另一个命名空间中C++全局命名空间访问
- 限制字段突变/对命名空间的访问
- 为什么std::generate在没有命名空间限定符的情况下是可访问的
- 在全局空间中访问的私有静态对象
- 嵌套命名空间:从内部命名空间访问值
- 从命名空间访问映射
- 在c++中从父命名空间访问隐藏操作符
- 如何在节俭中跨命名空间访问变量