首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > Optimizing the loading of AutoCAD .NET applications
【标  题】:Optimizing the loading of AutoCAD .NET applications
【关键字】:Optimizing,the,loading,of,AutoCAD,.NET,applications
【来  源】:http://blog.csdn.net/sdphg/archive/2007/01/24/1492216.aspx

Optimizing the loading of AutoCAD .NET applications

In my previous post I described how you could use the Autodesk.AutoCAD.Runtime.IExtensionApplication interface to implement initialization code in your .NET module. Building on this, we're now going to look at how use of the Autodesk.AutoCAD.Runtime.IExtensionApplication interface can also allow you - with very little effort - to optimize the architecture of your managed modules for faster loading into AutoCAD.

First some information from the "Using .NET for AutoCAD documentation" (which is available in the ObjectARX Developer's Guide on the ObjectARX SDK):

When AutoCAD loads a managed application, it queries the application's assembly for an ExtensionApplication custom attribute. If this attribute is found, AutoCAD sets the attribute's associated type as the application's entry point. If no such attribute is found, AutoCAD searches all exported types for an IExtensionApplication implementation. If no implementation is found, AutoCAD simply skips the application-specific initialization step.

...

In addition to searching for an IExtensionApplication implementation, AutoCAD queries the application's assembly for one or more CommandClass attributes. If instances of this attribute are found, AutoCAD searches only their associated types for command methods. Otherwise, it searches all exported types.

The samples that I've shown in this blog - and most of those on the ObjectARX SDK - do not show how you can use the ExtensionApplication or CommandClass attribute in your code, as it's not essential to implement them for your application to work. But if you have a large .NET module to be loaded into AutoCAD, it might take some time for AutoCAD to check the various objects in the assembly, to find out which is the ExtensionApplication and which are the various CommandClasses.

The attributes you need to implement are very straightforward:

C#:

[assembly: ExtensionApplication(typeof(InitClass))]

[assembly: CommandClass(typeof(CmdClass))]

VB.NET:

<Assembly: ExtensionApplication(GetType(InitClass))>

<Assembly: CommandClass(GetType(CmdClass))>

These assembly-level attributes simply tell AutoCAD where to look for the various objects it will otherwise need to identify by searching. Here's some more information from the documentation on the use of these attributes:

The ExtensionApplication attribute can be attached to only one type. The type to which it is attached must implement the IExtensionApplication interface.

...

A CommandClass attribute may be declared for any type that defines AutoCAD command handlers. If an application uses the CommandClass attribute, it must declare an instance of this attribute for every type that contains an AutoCAD command handler method.

While optimizing yesterday's code to reduce load-time, I also changed the structure slightly to be more logical. The above attributes also take classes within a namespace, so I decided to split the initialization code (the "Initialization" class) away from the command implementations (the "Commands" class), but keeping them both in the same ("ManagedApplication") namespace.

And here's the code...

C#:

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.EditorInput;

using System;

 

[assembly:

  ExtensionApplication(

    typeof(ManagedApplication.Initialization)

  )

]

[assembly:

  CommandClass(

    typeof(ManagedApplication.Commands)

  )

]

 

namespace ManagedApplication

{

  public class Initialization

    : Autodesk.AutoCAD.Runtime.IExtensionApplication

  {

    public void Initialize()

    {

      Editor ed =

        Application.DocumentManager.MdiActiveDocument.Editor;

      ed.WriteMessage("Initializing - do something useful.");

    }

 

    public void Terminate()

    {

      Console.WriteLine("Cleaning up...");

    }

  }

 

  public class Commands

  {

    [CommandMethod("TST")]

    public void Test()

    {

      Editor ed =

        Application.DocumentManager.MdiActiveDocument.Editor;

      ed.WriteMessage("This is the TST command.");

    }

  }

}

VB.NET:

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.ApplicationServices

Imports Autodesk.AutoCAD.EditorInput

Imports System

 

<Assembly: _

  ExtensionApplication( _

    GetType(ManagedApplication.Initialization))>

<Assembly: _

  CommandClass( _

    GetType(ManagedApplication.Commands))>

 

Namespace ManagedApplication

 

  Public Class Initialization

    Implements Autodesk.AutoCAD.Runtime.IExtensionApplication

 

    Public Sub Initialize() Implements _

    IExtensionApplication.Initialize

      Dim ed As Editor = _

        Application.DocumentManager.MdiActiveDocument.Editor

      ed.WriteMessage("Initializing - do something useful.")

    End Sub

 

    Public Sub Terminate() Implements _

    IExtensionApplication.Terminate

      Console.WriteLine("Cleaning up...")

    End Sub

 

  End Class

 

  Public Class Commands

 

    <CommandMethod("TST")> _

    Public Sub Test()

      Dim ed As Editor = _

        Application.DocumentManager.MdiActiveDocument.Editor

      ed.WriteMessage("This is the TST command.")

    End Sub

 

  End Class

 

End Namespace

 

September 8, 2006 in AutoCAD, AutoCAD .NET | Permalink

TrackBack

TrackBack URL for this entry:
http://www.typepad.com/t/trackback/5940741

Listed below are links to weblogs that reference Optimizing the loading of AutoCAD .NET applications:

Comments

Kean,

You're going to have to start charging us for this resource. :) Thanks again! It's admirable that you're so generous with your time and knowledge.

Hopefully you're putting a book together. ~Hint Hint~

 
C# 反射入门知识:【上一篇】
c:\winnt\microsoft.net\framework\v1.0.3705\Config\machine.config 报错(Configuration Error):【下一篇】
【相关文章】
  • Microsoft Visual C++ 6.0 SP6 resource compiler buffer overflow
  • Microsoft Photo Info 1.0
  • .net发邮件样例
  • 几个.Net开源的CMS系统
  • .NET(DOTNET)开源资源-内容管理系统(CMS)
  • asp.net的web.config文件中customErrors标记的用法
  • 几个不错的开源的.net界面控件
  • .net中用GDI+提高gif图片保存画质
  • 我们不需要因为开源而放弃 .NET
  • 开源的海天人.Net新闻系统(skyNews 1.2)
  • 【随机文章】
  • 使用MS SQL7的LINKED SERVER(一)
  • 谈谈CMS内容管理系统的两种方案:XSL+XML和HTML (二)
  • 我的Linux学习之旅 1 (Find命令使用实例)
  • C++ Builder 6 BizSnap/SOAP/WebService(2)-- 通过 SOAP 传递自定义类型数据
  • ACDSee:看图功能以外的功能介绍
  • patch
  • SQL Server 2000 与 SQL Server 7.0 版兼容性问题
  • 针对Nokia全屏情况下getHeight的BUG重载getHeight方法
  • AIX操作系统的备份与恢复
  • ASP创建EXCHANGE用户的一段代码
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.