gpt4 book ai didi

c# - 用多个 C# .dll 包装多个 C++ .dll

转载 作者:太空宇宙 更新时间:2023-11-04 13:07:02 25 4
gpt4 key购买 nike

我正在开发一个项目,用 C# 包装一个多 dll C++ SDK,试图用单独的 C# dll 包装每个原始 C++ dll。我遇到了一个问题,如果在C++库B和C中使用了C++库A中的某些公共(public)符号,则无法换行。由于这是 C++ 中非常常见的情况,显然我错过了一些微不足道的事情。花了几天时间,我仍然不知所措,非常感谢任何帮助如何继续前进。

以下简单示例重现了该问题:- 类 Point 应该在库 A 中定义- 类 Triangle 应该在使用 A 的库 B 中定义- 类 Quadrange 应该在使用 A 的库 C 中定义

"MyPoint.h"
class MyPoint
{
public:

MyPoint(double theX, double theY) : myX(theX), myY(theY) {}

double X() const { return myX; }
double& X() { return myX; }

double Y() const { return myY; }
double& Y() { return myY; }

private:

double myX;
double myY;
};

"MyTriangle.h"
#include "MyPoint.h"

class MyTriangle
{
public:

MyTriangle(const MyPoint& theP1, const MyPoint& theP2, const MyPoint& theP3) :
myP1(theP1),
myP2(theP2),
myP3(theP3) {}

MyPoint P1() const { return myP1; }
MyPoint& P1() { return myP1; }

MyPoint P2() const { return myP2; }
MyPoint& P2() { return myP2; }

MyPoint P3() const { return myP3; }
MyPoint& P3() { return myP3; }

private:

MyPoint myP1;
MyPoint myP2;
MyPoint myP3;
};

"MyQuadrangle.h"
#include "MyPoint.h"

class MyQuadrangle
{
public:

MyQuadrangle(const MyPoint& theP1, const MyPoint& theP2, const MyPoint& theP3, const MyPoint& theP4) :
myP1(theP1),
myP2(theP2),
myP3(theP3),
myP4(theP4) {}

MyPoint P1() const { return myP1; }
MyPoint& P1() { return myP1; }

MyPoint P2() const { return myP2; }
MyPoint& P2() { return myP2; }

MyPoint P3() const { return myP3; }
MyPoint& P3() { return myP3; }

MyPoint P4() const { return myP4; }
MyPoint& P4() { return myP4; }

private:

MyPoint myP1;
MyPoint myP2;
MyPoint myP3;
MyPoint myP4;

};

三角形和四边形分别设置三个点和四个点。因此,这两个类(MyTriangle 和 MyQuadrangle)都使用类 MyPoint。所有三个类都单独包装。每个类都有其接口(interface)文件:

"MyPoint.i"
%module MyPointWrapper
%{
#include "MyPoint.h"
%}
%include <windows.i>
%include "MyPoint.h"

"MyTriangle.i"
%module MyTriangleWrapper
%{
#include "MyTriangle.h"
%}
%include "MyPoint.i"
%include "MyTriangle.h"

"MyQuadrangle.i"
%module MyQuadrangleWrapper
%{
#include "MyQuadrangle.h"
%}
%include "MyPoint.i"
%include "MyQuadrangle.h"

为每个文件编写了命令行界面:C:\swigwin-3.0.10\swigwin-3.0.10\swig -csharp -c++ -命名空间几何 -outdir C:\Geometrics\MyPointNet\Generated MyPoint.iC:\swigwin-3.0.10\swigwin-3.0.10\swig -csharp -c++ -命名空间几何 -I"C:\Geometrics\MyPointcpp"-outdir C:\Geometrics\MyTriangleNet\Generated MyTriangle.iC:\swigwin-3.0.10\swigwin-3.0.10\swig -csharp -c++ -命名空间几何 -I"C:\Geometrics\MyPointcpp"-outdir C:\Geometrics\MyQuadrangleNet\Generated MyQuadrangle.i

当我在 C# 中使用 MyPoint 类时:

using System;
using geometry;

namespace Example
{
class Program
{
static void Main(string[] args)
{
MyPoint P = new MyPoint (3, 4, 5);
}
}
}

出现一个错误,指出每个类都包含一种 MyPoint:'MyPoint' 类型存在于 'MyTriangleNet, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 中和'MyPointNet,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null'

如何避免这种情况,但在 C# 中拥有三个功能齐全的类,条件是每个类将单独包装?

最佳答案

你几乎已经做到了,但是要简单地引用现有代码而不生成更多代码,你需要使用 %import "modulename.i" 而不是 %include , 所以你的 .i 文件变成:

MyPoint.i:

%module MyPointWrapper
%{
#include "MyPoint.h"
%}
%include "MyPoint.h"

MyQuadrangle.i:

%module MyQuadrangleWrapper
%{
#include "MyQuadrangle.h"
%}
%import "MyPoint.i"
%include "MyQuadrangle.h"

我的三角.i:

%module MyTriangleWrapper
%{
#include "MyTriangle.h"
%}
%import "MyPoint.i"
%include "MyTriangle.h"

无论如何我都不是 C# 专家,所以我希望您必须使用 %typemap(csimports) 或其他东西来确保例如MyTriangle.cs 知道如何使用非限定名称引用它引用的 MyPoint 类型,但至少当我在 Linux 上使用 Mono 测试它时构建了一个似乎不需要的单个可执行文件:

#!/bin/bash
swig3.0 -csharp -c++ -namespace geometry -outdir MyPointNet MyPoint.i
swig3.0 -csharp -c++ -namespace geometry -outdir MyTriangleNet MyTriangle.i
swig3.0 -csharp -c++ -namespace geometry -outdir MyQuadrangleNet MyQuadrangle.i

g++ -Wall -Wextra -o libMyPointWrapper.so MyPoint_wrap.cxx -shared -fPIC
g++ -Wall -Wextra -o libMyQuadrangleWrapper.so MyQuadrangle_wrap.cxx -shared -fPIC
g++ -Wall -Wextra -o libMyTriangleWrapper.so MyTriangle_wrap.cxx -shared -fPIC

mcs run.cs */*.cs && ./run.exe

一旦我更改了您的示例用法以调用存在的 MyPoint 的构造函数 (2-arg),所有工作都正常进行。我还在以下位置添加了对 MyTriangle 的快速测试:

MyTriangle T = new MyTriangle(P,P,P);

此外,要使这项工作跨多个程序集,您需要做 a little more work, as outlined in the documentation, to changeinternalpublic 的一些内部结构的可见性。您只需要在导入的模块内部执行此操作,因此在这种情况下 MyPoint.i 变为:

%module MyPointWrapper
SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
%{
#include "MyPoint.h"
%}
%include "MyPoint.h"

请注意,文档提出了一些比仅将其公开更好的解决方法。如果这是我的生产代码,我会研究这些代码。

关于c# - 用多个 C# .dll 包装多个 C++ .dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41744545/

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