OSG学习:C#调用非托管C++方法——C++/CLI
发布日期:2025-05-01 06:07:18 浏览次数:2 分类:技术文章

本文共 2001 字,大约阅读时间需要 6 分钟。

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

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

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

首先要确定OSG的开发环境配置好。见的第五步环境变量。

以下就直接创建工程:

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

 

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

 

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

head.h

#pragma once#include
#include
#include
#include
#include
#include
#include
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++代码中提取出了显示上一篇博文()中的牛的方法,也就是生成的这个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工程(最好保持一致),否则可能会报错。在项目的属性总可看到框架版本。

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

 

上一篇:OSG学习:OSG中的智能指针
下一篇:OSG中找到特定节点的方法(转)

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月24日 20时53分27秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章