【问题标题】:Incorrect return value from externally defined C function, entrypoint may have something to do with it?外部定义的 C 函数的返回值不正确,入口点可能与它有关吗?
【发布时间】:2011-07-24 13:38:02
【问题描述】:

我在 xcode 中编译了一个静态库,它只包含一个 .c 源文件:

int Get10()
{
    return 10;
}

这就是它包含在 .cs 源文件中的方式:

    [DllImport ("__Internal",EntryPoint="UIRectFrameUsingBlendMode")]
    private static extern int Get10 ();

但是Get10()的返回值是'0'。请注意,EntryPoint 是 UIRectFrameUsingBlendMode,这是没有原因的,如果我删除了 entrypoint,则找不到函数 Get10() 并引发异常,尽管这可能与问题有关。问题是虽然我不确定将哪个入口点定义为 lib 基本上是一个带有函数的单个 c 源文件。我曾尝试使用 EntryPoint="Get10" 但这导致:

System.EntryPointNotFoundException: Get10 at (wrapper 托管到本地)ChicksnVixens.ChicksnVixensGame:Get10 () at ChicksnVixens.ChicksnVixensGame..ctor () [0x000a0] 在 /ChicksnVixens/ChicksnVixensGame.cs:36

代码正在 iPhone 模拟器的 MonoDevelop 中编译和运行。

有什么想法吗?

【问题讨论】:

  • EntryPoint(如果存在)应该与您的本地方法的名称相匹配。如果您想重命名托管端的方法(否则干脆不使用它),这很有用。我的猜测是您的库未链接(或链接错误)或 Get10 符号不可见(例如 C 中的静态)。在这种情况下,运行时应该抛出一个 EntryPointNotFoundException。
  • 'nm' 和 'otool' 都可以列出从静态库中导出的内容(即您应该看到 Get10,否则这是您的原生库的构建问题)。在这两个工具上查看“man”以获取列表。
  • @poupou,感谢您的提醒。我仔细研究了一下,结果证明你是对的(关于入口点的事情和没有输出的函数)。随意做出与您的 cmets 相同的答案,我会将其标记为您的答案,因为您的 cmets 肯定有帮助:)

标签: c# xcode mono xamarin.ios pinvoke


【解决方案1】:

EntryPoint(如果存在)应该与您的本地方法的名称相匹配。如果您想重命名托管端的方法(否则干脆不使用它),这很有用。

我的猜测是您的库未正确链接或 Get10 符号不可见(例如 C 中的静态)。在这种情况下,运行时应该抛出一个 EntryPointNotFoundException。

'nm' 和 'otool' 都可以列出从静态库中导出的内容(即您应该看到 Get10,否则这是您的原生库的构建问题)。查看两个工具上的“man”以获取列表。

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多