由于OSG编译好的的语言为C++,由于项目需要,需要使用C#来操作OSG,因此需要寻找二者之间的联系方法。
OSG编译好的代码为非托管代码,C#不能直接调用,因此,需要将之转换为托管代码(托管dll)。C#工程中可以直接引用托管dll。
C++/CLI就出场了。从C++到C++/CLI介绍的非常详细。MSDN也是很好的学习资源。
首先要确定OSG的开发环境配置好。见OSG学习:WIN10系统下OSG+VS2017编译及运行的第五步环境变量。
以下就直接创建工程:
1.新建项目:文件——新建——项目——Visual C++——CLR——CLR空项目
2..添加头文件和C++文件:右键项目名——添加——新建项——分别创建一个头文件(.h)和C++文件(.cpp)
分别在两个文件中写下以下代码:
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的是我忘了修改,忽略掉。要先选择平台,再进行下面的配置,否则平台修改后配置就没有了。)
4.属性设置:右键项目名称——属性
4.1.配置属性——常规——目标文件扩展名设置为.dll,配置类型设置为动态库(.dll)
4.2.配置属性——VC++目录——包含目录里添加编译好的include文件夹,库目录里添加编译好的lib文件夹。
下图展示添加include文件夹,lib文件夹的添加方法相同。
4.3.配置属性——链接器——输入——附加依赖项里填入下面内容
OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib
4.4.配置属性——C/C++——预处理器——预处理器定义添加WIN32
5.生成.dll
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工程(最好保持一致),否则可能会报错。在项目的属性总可看到框架版本。
点击启动即可出来这头牛。