gpt4 book ai didi

iphone - Monotouch PInvoke System.EntryPointNotFoundException

转载 作者:行者123 更新时间:2023-12-03 19:45:16 26 4
gpt4 key购买 nike

我使用 monotouch 将一些 C# 代码嵌入到 iPhone Objective-C 应用程序中。我能够调用 C# 代码并获取返回值,但无法使用 PInvoke 从 C# 代码调用 C 函数。我正在尝试让一个简单的例子起作用。这是一个简单的计算器。 objective-c 代码调用 C# 代码来添加两个整数。然后,C# 代码应该回调 Objective-C 代码并为其提供更新的值。下面是处理计算的 C# 代码:

public class MyClass
{
static public void Add(int a, int b)
{
updateResult(a + b);
}

[DllImport("__Internal", EntryPoint="updateResult")]
static extern public void updateResult(int result);
}

这是我初始化 mono 并处理 add 方法的代码:

@implementation Mono

- (id)init {
self = [super init];

if (self) {
NSBundle *main = [NSBundle mainBundle];
NSString *path = [main bundlePath];
const char *c_path = [path UTF8String];

[main autorelease];
[path autorelease];

chdir (c_path);
setenv ("MONO_PATH", c_path, 1);
setenv ("MONO_XMLSERIALIZER_THS", "no", 1);
setenv ("DYLD_BIND_AT_LAUNCH", "1", 1);
setenv ("MONO_REFLECTION_SERIALIZER", "yes", 1);

#if defined (__arm__)
mono_aot_register_module (mono_aot_module_mscorlib_info);
mono_aot_register_module (mono_aot_module_Math_info);

mono_jit_set_aot_only (TRUE);
#endif
mono_jit_init("MonoTouch");
MonoAssembly *assembly = mono_assembly_open("Math.dll", NULL);
MonoImage *img = mono_assembly_get_image(assembly);
MonoClass *cls = mono_class_from_name(img, "Math", "MyClass");
MonoMethodDesc *methodDesc = mono_method_desc_new("Math.MyClass:Add", TRUE);
_addMethod = mono_method_desc_search_in_class(methodDesc, cls);
}

return self;
}

- (void)addA:(int)a plusB:(int)b {
void *params[] = { &a, &b };
mono_runtime_invoke(_addMethod, NULL, params, NULL);
}

@end

这是 updateResults 方法的定义:

extern void updateResult(int result) {
printf("Got Result");
}

当从 C# 端调用 updateResults 时,我收到以下异常:

Unhandled Exception: System.EntryPointNotFoundException: updateResult
at (wrapper managed-to-native) Math.MyClass:updateResult (int)
at Math.MyClass.Add (Int32 a, Int32 b) [0x00000] in <filename unknown>:0

我可以使用以下命令查看二进制文件中的符号:

$ nm Calc | grep updateResult
00002b2e t _updateResult

设置 MONO_LOG_LEVEL 环境变量进行调试 在尝试 PInvoke 时,我得到以下输出。看起来好像找到了方法,然后就找不到了:

Mono: DllImport attempting to load: '_Internal'.Mono: Searching for 'updateResult'.Mono: Probing 'updateResult'.Mono: Probing 'updateResult'.Mono: Probing 'updateResultA'.Mono: Probing 'updateResultA'.Mono: DllImport attempting to load: '_Internal'.Mono: Searching for 'updateResult'.Mono: Probing 'updateResult'.Mono: Probing 'updateResult'.Mono: Probing 'updateResultA'.Mono: Probing 'updateResultA'.Mono: AOT FOUND AOT compiled code for (wrapper managed-to-native) Math.MyClass:updateResult (int) 0x3bc8 - 0x3d90 0x3dcb

Mono: DllImport attempting to load: '__Internal'.Mono: Searching for 'updateResult'.Mono: Probing 'updateResult'.Mono: Probing 'updateResult'.Mono: Probing 'updateResultA'.Mono: Probing 'updateResultA'.Unable to resolve pinvoke method 'Math.MyClass:updateResult (int)' Re-run with MONO_LOG_LEVEL=debug for more information.

我花了很长时间试图解决这个问题。从我读到的内容看来这应该是相当微不足道的,但我无法让它工作。任何帮助将不胜感激。

最佳答案

使用 Selectors 会更好吗? ?

这是 MonoTouch 制造商建议的默认路径。

关于iphone - Monotouch PInvoke System.EntryPointNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5085528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com