【问题标题】:How to call a function from DLL in UWP?如何从 UWP 中的 DLL 调用函数?
【发布时间】:2016-11-09 13:33:39
【问题描述】:

C中有代码(之一):

     void Function(char *output, size_t size);

C#中有代码:

    [DllImport(@"C:\path\Name.dll",
                CallingConvention = CallingConvention.Cdecl,
                CharSet = CharSet.Ansi, EntryPoint = "Function")]
    static extern void Function([In, Out] StringBuilder output,
                                [In, MarshalAs(UnmanagedType.SysUInt)] UIntPtr size);

如果我调用此函数应用程序失败并出现此错误:

Unable to load DLL 'C:\path\Name.dll': Access denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

怎么了?我必须做什么?

【问题讨论】:

  • 您有两个问题 1) 您必须在调用 DLL 之前分配变量输出。字符 [] 输出 = 新字符 [256](); 2) c# 中的 char 是两个字节,而在 c 中是一个字节。通常你应该使用 byte[] 而不是 char[]。
  • @jdweng 如果我在没有参数的情况下调用另一个方法,应用程序会因此错误而失败。 (对不起我的英语不好)
  • 见帖子:stackoverflow.com/questions/38146181/…。使用 byte[] 而不是 char[]。不要使用字符串生成器。
  • 虽然可能还有其他问题,但这里解释了“访问被拒绝”错误的原因stackoverflow.com/questions/42381582/…

标签: c# uwp


【解决方案1】:

在您的项目中添加 DLL 并将其设置为在输出目录中复制的内容类型。然后以这种方式引用它(不要添加扩展名“.dll”:

 [DllImport(@"Name",
                CallingConvention = CallingConvention.StdCall,
                CharSet = CharSet.Ansi, EntryPoint = "Function")]
    static extern void Function([In, Out] StringBuilder output,
                                [In, MarshalAs(UnmanagedType.SysUInt)] UIntPtr size);

这是 SqlLite 所做的(例如:https://github.com/praeclarum/sqlite-net/blob/master/src/SQLite.cs):)

正如 jdweng 所指出的,您可能也想使用 byte[] 而不是 StringBuilder。

【讨论】:

  • 如果我这样写,应用程序找不到 dll:[DllImport(@"Name"。如果我写 [DllImport(@"../Name" 应用程序失败并出现旧错误。我没有知道我应该做什么(
  • 可能是 DLL 使用了未在 UWP 中实现的 API? (这个 DLL 不是我创造的)
  • 我不知道这个。也许这是需要更改的调用约定。尝试使用 CallingConvention.Cdecl 可能吗?
  • 很抱歉,没有你的dll就帮不了你了,希望你能找到答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多