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

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

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


 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值