【发布时间】:2016-07-06 21:57:02
【问题描述】:
我的 C# 代码使用第三方库,用 C++ 编写并使用 Swig 将其包装在 C# 中(这里有三个项目,MyCodeCS、ThirdCpp 和 ThirdCs)
因此,如果我在 cpp 中有带有公共构造函数 Acpp() 和 Acpp(int) 的 Acpp 类,我最终会使用带有类 Acs、正确定义的构造函数 Acs() 和 Acs(int) 的包装 C# 版本(到目前为止,一切都很好),它们都使用内部的 swig 生成的构造函数:Acs(IntPtr cPtr,bool)。
(当然 cpp 和 cs 类都被命名为 A,但为了清楚起见,我会用 cpp 和 cs 后缀命名它们)
现在,我正在集成一个新的 cpp 模块 (MyCodeCpp),其中包含一个继承自 Acpp 的类 Bcpp。到目前为止,一切都很好:Bcpp 继承自 Acpp,我可以毫无问题地从我的 C# 代码中调用它,使用它的IntPtr。
我的问题是,为了让我的 Bcs 对象被识别为 Acs,我需要定义这样的 Bcs 类。这是一个相当愚蠢的,因为我已经得到了 cptr:
public class Bcs : Acs
{
public Bcs(IntPtr cptr): base(cptr,true){}
}
问题是...Acs(IntPtr,bool) 是内部的,这意味着如果我想这样做,我需要:
- 将 Bcs 添加到thirdCS 项目中并重建thirdCS,这就是我现在所做的并且工作正常但让我的首席架构师不满意,因为现在我们有一个应该属于MyCodeCS 的类,因为它是MyCodeCpp 类的包装器,其实属于thirdCs
-
以某种方式修改 swig 行为,以便
Acs(IntPtr,bool)受到内部保护而不是内部保护,因此它可以由基于 MyCodeCS 的 Bcs 类调用
问题是:我不知道该怎么做,或者即使有可能?
非常感谢
【问题讨论】:
-
你能显示示例 .i 文件吗?
-
虽然我很确定您的问题有一个简单的解决方案,但仅通过文字很难理解潜在的问题。你能展示一个minimal 完整的例子,我需要在我的开发环境中试用它吗?我什至无法说服自己,您目前实际上正在尝试解决正确的问题。