【问题标题】:i can not import c++ dll function to c# using pinvke [duplicate]我无法使用pinvke将c ++ dll函数导入c# [重复]
【发布时间】:2017-02-06 22:28:15
【问题描述】:

我想用c++函数代码转成.net代码

MYDLL_API BOOL GetFolderSize(LPCTSTR lpszStartFolder, 
               BOOL bRecurse, 
               BOOL bQuickSize,
               PLARGE_INTEGER lpFolderSize,
               LPDWORD lpFolderCount /*= NULL*/,
               LPDWORD lpFileCount /*= NULL*/);

所以我创建了 dll 来导出代码 然后在 C# 代码中使用 PInvoke

[StructLayout(LayoutKind.Explicit, Size = 8)]
    struct LARGE_INTEGER
    {
        [FieldOffset(0)]
        public Int64 QuadPart;
        [FieldOffset(0)]
        public UInt32 LowPart;
        [FieldOffset(4)]
        public Int32 HighPart;
    }

  [DllImport("mydll.dll")]
    extern static bool GetFolderSize(string lpszStartFolder,
                               bool bRecurse,
                               bool bQuickSize,
                               out LARGE_INTEGER lpFolderSize,
                                out UInt32 lpFolderCount,
                                out UInt32 lpFileCount);

这有什么问题????

但是当我调用它时,它会给我运行时异常 调用 PInvoke 函数 'dublication!dublication.Form1::GetFolderSize' 使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配

【问题讨论】:

  • PLARGE_INTEGER 和 LPDWORD 应该是 IntPtr,不是吗?
  • 我尝试并重试此方法,但它不起作用,并且引发了相同的异常
  • @EdPlunkett “out”将添加指针。
  • @RobertFraser 好点,我不知道我今天的大脑在哪里
  • 注意bool,C++ 在 windows.h 和 the two are not the same size 中有一个 'bool' 内置类型和一个 BOOL typedef。见blogs.msdn.microsoft.com/jaredpar/2008/10/14/…

标签: c# c++ dll pinvoke


【解决方案1】:

我看到了两个问题:

  • 调用约定:P/Invoke 的默认调用约定是 WINAPI。根据 MYDLL_API 是什么,您可能需要执行类似 [[DllImport("mydll.dll", CallingConvention = CallingConvention.Stdcall)]]

  • 的操作
  • 字符串类型 -- LPCTSTR 不是默认的字符串转换。

完整的声明看起来像...

[DllImport("mydll.dll", CallingConvention = CallingConvention.Stdcall)]
extern static int GetFolderSize(
    [MarshalAs(UnmanagedType.LPStr)] string lpszStartFolder,
    int bRecurse,
    int bQuickSize,
    out long lpFolderSize,
    out uint lpFolderCount,
    out uint lpFileCount);

如果您发布 MYDLL_API 是什么,我们会有更好的理解。此外,如果您不反对将unsafe 添加到所有内容中,我发现它可以让使用指针/输出参数/等更加轻松

【讨论】:

  • 我会写的
  • 很抱歉,如果我不理解这个 c++ 函数,如何通过 pinvoke 在 c# 中声明它 __declspec(dllexport) BOOL GetFolderSize(LPCTSTR lpszStartFolder, BOOL bRecurse, BOOL bQuickSize, PLARGE_INTEGER lpFolderSize, LPDWORD lpFolderCount / *= NULL*/, LPDWORD lpFileCount /*= NULL*/);
猜你喜欢
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2021-05-31
  • 1970-01-01
相关资源
最近更新 更多