2

所以我在objective-c中实现了一个API,然后我想统一使用它。这个任务的所有解决方案,从 c#(unity) 调用objective-c,我发现如何使用围绕objective-c 代码的中间c-wrapper 执行从c# 到objective-c 的简单调用,像这样这样. 然而,这些简单的调用消除了objective-c API 的面向对象特性。

更准确地说,我的意思是,假设我在我的 Objective-C API 中有一个类:

@interface MyVector:NSObject 
-(MyVector*)crossProduct:(MyVector*);
@end

为了crossProduct从 c# 代码中调用该方法,按照上述帖子中描述的方式,可能的 c-wrapper 可能如下所示:

//say myVector_c is a c struct
extern "C" void crossProduct_c(myVector_c* v1, myVector_c* v2, myVector_c* v_result){

   MyVector* v1_objc=[[MyVector alloc] initWithx:v1.x andy:v1.y andz:v1.z];
   MyVector* v2_objc=[[MyVector alloc] initWithx:v2.x andy:v2.y andz:v2.z];
   MyVector* v_result_objc=[v1_objc crossProduct:v2_objc];

   v_result.x=v_result_obj.x;
   v_result.y=v_result_obj.y;
   v_result.z=v_result_obj.z;
}

这意味着为了使用统一的 c# 代码中的交叉产品功能,一个(可能......)需要执行类似的操作

using System.Runtime.InteropServices;
public class testScript : MonoBehaviour {
...
//import the myVector_c struct

[System.Runtime.InteropServices.DllImport("__Internal")]
extern static public void crossProduct_c(myVector_c*,myVector_c*,myVector_c*);

//and now (fingers crossed...) the cross product functionality is available through
//the crossProduct_c function

 }

现在这种方法对我来说似乎很丑陋和多余。如果能够以MyVector更直接的方式访问对象及其在 Objective-c 代码中已经实现的功能,那就太好了。我的意思是,以如下方式实现 c-wrapper 会非常好:

MyVector v1=new MyVector();
MyVector v2=new MyVector();
MyVector vResult=v1.crossProduct(v2);

可以在 C# 代码中工作,而无需从 c-wrapper 的“功能”实现在 c# 代码中重新实现 MyVector。我的意思是,如果您可以在 c# 中执行以下操作:

class MyVector_csh{
   MyVector v;
   public MyVector_csh(){
      v=new MyVector();
   }
}

或类似的东西,但不会因为中间的 c-wrapper 而失去面向对象。

所以再搜索一下,我发现了使用 c-structs 将 c++ 代码包装在 c 代码中的方法,以“模仿”c++ 代码的面向对象,就像这样。在没有 100% 确定我理解该方法的情况下,在我看来,这将是从 c# 到 Objective-c 对象的“转发”调用的一种更简洁的方法。不确定这样的方法如何以及是否可以将objective-c(而不是c++)包装在c代码中。

所以我的问题是,对于在混合不同语言方面比我有更多经验的人(同时也是面向对象概念的崇拜者),如果这样的方法有意义,或者是否有人可以提出另一种方法,因为在过去的几天里,从 c# 代码中处理 Objective-c 类的优雅方式对我来说已经成为一个头疼的问题......

4

0 回答 0