wpf 是否可以使用DllImport访问命名空间?

5fjcxozz  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(165)

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

v7pvogib

v7pvogib1#

如果要检查函数的导出名称,可以用途:

dumpbin /exports my_native_lib.dll

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

sg3maiej

sg3maiej2#

DllImport适用于“全局”C函数,而不是C类-对于C类,您必须为所需的函数创建C Package 。请参见:using a class defined in a c++ dll in c# code

fxnxkyjh

fxnxkyjh3#

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

xuo3flqw

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这样你就可以调用损坏的函数名。

相关问题