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

来源:互联网 发布:身份证照片识别软件 编辑:程序博客网 时间:2024/06/04 20:10

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

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

托管与非托管。

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

以下就直接创建工程:

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.libosgd.libosgDBd.libosgUtild.libosgGAd.libosgViewerd.libosgTextd.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工程(最好保持一致),否则可能会报错。在项目的属性总可看到框架版本。

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