EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 1796|回复: 4
打印 上一主题 下一主题

[混合编程] C++/CLI与C#托管代码与非托管代码的混编

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 16:22:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

ObjectArx编程论坛忽悠悠原创
1,首先在解决方案中建立一个C#项目,用来注册命令
2,然后建立一个C++类库,用来实现托管代码与Arx非托管代码的衔接.具体的设置方法如下:
在项目属性中添加引用acdbmgd和acmgd,并且添加对应Arx版本的lib和inc目录
然后在Stdafx.h中添加如下代码

#include <Windows.h>
#include "arxHeaders.h"
#include "mgdinterop.h"
添加一个新类DrawLine,用来绘制一条直线,代码如下
  • #pragma once
  • using namespace System;
  • using namespace System::Diagnostics;
  • using namespace System::Collections;
  • using namespace System::Text;
  • using namespace System::Runtime::InteropServices;
  • using namespace Autodesk::AutoCAD::ApplicationServices;
  • using namespace Autodesk::AutoCAD::Runtime;
  • using namespace Autodesk::AutoCAD::DatabaseServices;
  • using namespace Autodesk::AutoCAD::EditorInput;
  • using namespace Autodesk::AutoCAD::Geometry;
  • namespace Tools {
  • public ref class DrawLine
  • {
  • public:
  •   static ObjectId Draw(Point3d ptS, Point3d ptE)
  •   {
  •    AcGePoint3d gePtS, gePtE;
  •    gePtS = GETPOINT3D(ptS);
  •    gePtE = GETPOINT3D(ptE);
  •    AcDbLine *pLine = new AcDbLine(gePtS, gePtE);
  •    AcDbObjectId objId = AcDbObjectId::kNull;
  •    if (AppendEntity(pLine, objId))
  •    {
  •     pLine->close();
  •     return ToObjectId(objId);
  •    }
  •    else
  •    {
  •     return ObjectId::Null;
  •    }
  •   }
  • private:
  •   //将实体加入模型空间
  •   static bool AppendEntity(AcDbEntity *pEnt,AcDbObjectId& objId)
  •   {
  •    bool bValue=true;
  •    AcDbBlockTable *pBlockTable;
  •    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
  •    AcDbBlockTableRecord *pBlockTableRecord;
  •    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
  •    pBlockTable->close();
  •    if ( Acad::eOk != pBlockTableRecord->appendAcDbEntity(objId, pEnt) ) bValue=false;
  •    pBlockTableRecord->close();
  •    return bValue;
  •   }
  • };

复制代码

3,设置解决方案属性中的"项目依赖项",将C#项目的依赖项设置为C++项目
4,给C#项目添加引用,在项目选项卡里面选择C++项目,然后添加如下代码
  • using System;
  • using System.Text;
  • using System.Collections;
  • using System.IO;
  • using System.Windows.Forms;
  • using Autodesk.AutoCAD.ApplicationServices;
  • using Autodesk.AutoCAD.Runtime;
  • using Autodesk.AutoCAD.DatabaseServices;
  • using Autodesk.AutoCAD.EditorInput;
  • using Autodesk.AutoCAD.Geometry;
  • using Tools;
  • namespace Test
  • {
  •     public class Command
  •     {
  •         [CommandMethod("Test")]
  •         public void Test()
  •         {
  •             DrawLine.Draw(new Point3d(0, 0, 0), new Point3d(1, 1, 1));
  •         }
  •     }
  • }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

0

主题

4

帖子

37

积分

BIM书童

Rank: 1

积分
37

社区QQ达人

3F
发表于 2014-4-7 11:09:34 | 只看该作者
你这样建立的C++代码不是非托管的吧。你这样你的代码必须要选择公共语言库支持。 这样,不算真正的非托管代码。要使用的话,可以使用dll接口的方式调用
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-23 19:58

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表