use*_*854 4 macos objective-c .net-assembly
C#代码:( windows)
Assembly assembly = Assembly.LoadFrom(AssemblyPath);
System.Type[] objTypes = assembly.GetTypes();
Type libType = null;
Run Code Online (Sandbox Code Playgroud)
我想为Mac实现相同的功能,其中AssemblyPath是静态库(libTEST.a)或dylib文件的路径.在Objective-C(Mac)中可以吗?我试过NSBundle.但我想要一些好的解决方案.
小智 13
首先,这与Xcode 完全无关.
现在,您无法动态加载静态库,因为静态库只是目标文件的集合,它们本身不是可执行的.
要加载动态库,请使用dlopen()API:
void *handle = dlopen("/path/to/library.dylib", RTLD_LAZY);
Run Code Online (Sandbox Code Playgroud)
要获得C函数指针:
int (*computeAnswer)(void) = dlsym(handle, "ComputeAnswer");
int answer = computeAnswer(); // 42
Run Code Online (Sandbox Code Playgroud)
要获得没有extern "C"链接的C++函数指针(错位名称):
int (*mangledFunction)(void) = dlsym(handle, "i$mangledFunction_@v");
Run Code Online (Sandbox Code Playgroud)
您甚至可以通过链接器编译器的Objective-C命名约定来解决自己:
@class MyShinyClass;
Class cls = dlsym(handle, "OBJC_CLASS_$_MyShinyClass");
MyShinyClass *instance = [[cls alloc] init];
Run Code Online (Sandbox Code Playgroud)
完成库后,请将其丢弃:
dlclose(handle);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6486 次 |
| 最近记录: |