OSG学习:C#调用非托管C++方法——C++/CLI

时间:2022-09-01 15:54:26

由于OSG编译好的的语言为C++,由于项目需要,需要使用C#来操作OSG,因此需要寻找二者之间的联系方法。

OSG编译好的代码为非托管代码,C#不能直接调用,因此,需要将之转换为托管代码(托管dll)。C#工程中可以直接引用托管dll。

托管与非托管

C++/CLI就出场了。从C++到C++/CLI介绍的非常详细。MSDN也是很好的学习资源。

以下就直接创建工程:

1.新建项目:文件——新建——项目——Visual C++——CLR——CLR空项目

OSG学习:C#调用非托管C++方法——C++/CLI


2..添加头文件和C++文件:右键项目名——添加——新建项——分别创建一个头文件(.h)和C++文件(.cpp)

OSG学习:C#调用非托管C++方法——C++/CLI


分别在两个文件中写下以下代码:

head.h

#pragma once
#include<osgViewer/Viewer>
#include<osgDB/ReadFile>
#include<osgViewer/ViewerEventHandlers>
#include<osgGA/StateSetManipulator>
#include<osg/Material>
#include<osg/Light>
#include<osg/LightSource>

namespace C_CLI {
public ref class View {
public:
int setSceneData();
};
}

source.cpp

#include "head.h"

int::C_CLI::View::setSceneData()
{
osgViewer::Viewer* viewer = new osgViewer::Viewer;
osg::Group* group = new osg::Group;
group->addChild(osgDB::readNodeFile("cow.osg"));

viewer->setSceneData(group);
return viewer->run();
}

注意:命名空间不能写为C++CLI,“++”是不能识别的。

这里的代码是指从OSG的C++代码中提取出了显示上一篇博文(WIN10系统下OSG VS2017编译及运行)中的牛的方法,也就是生成的这个dll中有个显示牛的方法,那么在C#中引入这个dll,实例化View,调用setSceneData()则可显示出牛。


3.选择解决方案平台x64:如果你的OSG是32位,就不用修改,如果是64位,就要修改为64。(我的是64,下面显示为32的是我忘了修改,忽略掉。要先选择平台,再进行下面的配置,否则平台修改后配置就没有了。)

OSG学习:C#调用非托管C++方法——C++/CLI


4.属性设置:右键项目名称——属性

OSG学习:C#调用非托管C++方法——C++/CLI


4.1.配置属性——常规——目标文件扩展名设置为.dll,配置类型设置为动态库(.dll)

OSG学习:C#调用非托管C++方法——C++/CLI


4.2.配置属性——VC++目录——包含目录里添加编译好的include文件夹,库目录里添加编译好的lib文件夹。

下图展示添加include文件夹,lib文件夹的添加方法相同。

OSG学习:C#调用非托管C++方法——C++/CLI

OSG学习:C#调用非托管C++方法——C++/CLI


4.3.配置属性——链接器——输入——附加依赖项里填入下面内容

OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib


OSG学习:C#调用非托管C++方法——C++/CLI


4.4.配置属性——C/C++——预处理器——预处理器定义添加WIN32

OSG学习:C#调用非托管C++方法——C++/CLI

OSG学习:C#调用非托管C++方法——C++/CLI


5.生成.dll

OSG学习:C#调用非托管C++方法——C++/CLI


6.建立C#工程并引用生成的.dll:新建项目——Visual C#——控制台应用(.NET Framework)

在右侧解决方案资源管理器项目名称下面的“引用”中,右键引用,添加引用,点击引用管理器右下方的“浏览”,把上面生成的.dll引用进来。.dll路径即是上图输出框中的路径。


7.实例化类并生成图像:

实例化View类,调用setSceneData()方法

由于View类是在生成.dll的工程的C_CLI命名空间下,因此需要加入using C_CLI

由此Program.cs中代码为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using C_CLI;//在生成.dll工程中,命名空间为C_CLI,引用

namespace CsharpOSG
{
class Program
{
static void Main(string[] args)
{
View view = new View();
view.setSceneData();
}
}
}


注意,C#工程的.net框架必须要高于C++/CLI工程(最好保持一致),否则可能会报错。在项目的属性总可看到框架版本。

点击启动即可出来这头牛。

OSG学习:C#调用非托管C++方法——C++/CLI