六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

使用C#進(jìn)行AutoCAD的二次開(kāi)發(fā)(二)

[摘要]大家好,今天我繼續(xù)給各位介紹利用C#進(jìn)行AutoCAD的二次開(kāi)發(fā)。在這一講中,主要介紹上一講例子中存在的問(wèn)題。 在上一次的例子中我是通過(guò)引用AutoCAD 2004 Type Library來(lái)進(jìn)行C#與AutoCAD之間的通信,但這種方法存在兩個(gè)致命的缺點(diǎn)。第一個(gè)缺點(diǎn)是每次調(diào)試程序...

       大家好,今天我繼續(xù)給各位介紹利用C#進(jìn)行AutoCAD的二次開(kāi)發(fā)。在這一講中,主要介紹上一講例子中存在的問(wèn)題。

         在上一次的例子中我是通過(guò)引用AutoCAD 2004 Type Library來(lái)進(jìn)行C#與AutoCAD之間的通信,但這種方法存在兩個(gè)致命的缺點(diǎn)。第一個(gè)缺點(diǎn)是每次調(diào)試程序的時(shí)候C#都要重新啟動(dòng)AutoCAD,如果調(diào)試的次數(shù)非常多(比如跟蹤錯(cuò)誤然后調(diào)試),那么編程的效率就很低,因?yàn)閱?dòng)一次CAD還是需要較長(zhǎng)的時(shí)間。相對(duì)于第一個(gè)缺點(diǎn),第二個(gè)缺點(diǎn)則更要命。由于.NET本身的問(wèn)題,Interop.AutoCAD.dll文件(就是通過(guò)它才實(shí)現(xiàn)了C#與AutoCAD之間的通信)存在著一些bug,因此雖然有時(shí)你的代碼是完全正確的,但C#編譯器還是拋出莫名其妙的錯(cuò)誤。那不是完蛋了嗎?我曾經(jīng)有一階段就因?yàn)檫@兩個(gè)要命的東東差一點(diǎn)放棄了C#而想改學(xué)ObjectArx了,呵呵,不過(guò)還是運(yùn)氣好,我偶爾一次在網(wǎng)上看了一篇外國(guó)人寫(xiě)的文章,他專(zhuān)門(mén)介紹了這兩個(gè)問(wèn)題的解決辦法。下面就來(lái)解決這兩個(gè)問(wèn)題。

         首先來(lái)看第二個(gè)難題,按以下步驟來(lái)進(jìn)行:

1.        隨便用Visual Studio .NET建立一個(gè)C#應(yīng)用程序,然后按照上一篇文章中的設(shè)置加入AutoCAD 2004 Type Library,然后不加入任何代碼,編譯你的程序。

2.        在Visual Studio .NET命令行工具下用ildasm.exe(這個(gè)工具可以在Visual Studio .NET安裝光盤(pán)中找到)把Interop.AutoCAD.dll文件(這個(gè)文件在步驟1中生成的項(xiàng)目的Bin\Release文件夾中)編譯成中間語(yǔ)言Interop. AutoCAD.il。注意:在步驟1中建立的項(xiàng)目的編譯設(shè)置為Release模式。

    ildasm.exe /source Interop.AutoCAD.dll /output=Interop. AutoCAD.il

    又要注意了:把ildasm.exe,Interop.AutoCAD.dll放在同一目錄下。

3.在記事本中打開(kāi)Interop. AutoCAD.il文件,然后查找結(jié)尾是“SinkHelper”而開(kāi)頭為 ".class private auto ansi sealed _DAcad“的語(yǔ)句,把語(yǔ)句中的private 改為public,然后保存Interop. AutoCAD.il文件。

4.使用ilasm.exe把Interop. AutoCAD.il文件編譯為Interop.AutoCAD.dll文件,同樣是在Visual Studio .NET命令行工具下進(jìn)行。

    ilasm.exe  /resource=Interop.AutoCAD.res /dll Interop.AutoCAD.il /output=Interop. AutoCAD.dll

 Interop.AutoCAD.res文件是在步驟1中生成的。

5.顯然你不愿意每次編寫(xiě)應(yīng)用程序時(shí)都通過(guò)上一篇文章中介紹的方法來(lái)加入Interop. AutoCAD.dll,那太麻煩了。你可以用下面的方法來(lái)讓程序自動(dòng)加入該文件:找到C:\Program Files\Microsoft.NET\ Primary Interop Assemblies 文件夾,然后把上面生成的

Interop.AutoCAD.dll文件拷貝進(jìn)去。     

       好了,第二個(gè)問(wèn)題解決了,接下來(lái)看第一個(gè)。

       在VBA中,編程者可以使用GetObject函數(shù)來(lái)獲得當(dāng)前活動(dòng)的AutoCAD對(duì)象,但在C#中卻沒(méi)有,為了這個(gè)函數(shù)我?guī)缀醢袽SDN給翻遍了,然后去各種C#論壇問(wèn)各位高手,結(jié)果都沒(méi)得到解決,呵呵,可能?chē)?guó)內(nèi)使用C#的人比較少吧。還是在老外的論壇上看到了一篇就是講這個(gè)問(wèn)題的文章才把這個(gè)難題給解決了。使用下面的語(yǔ)句就可以獲得當(dāng)前活動(dòng)的AutoCAD對(duì)象了:

   (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16")

     (對(duì)于CAD2000和CAD2002,則把16改為15)

當(dāng)然以上語(yǔ)句必須在AutoCAD打開(kāi)的情況下才能使用,否則會(huì)發(fā)生錯(cuò)誤,對(duì)于AutoCAD沒(méi)打開(kāi)的情況,可以使用上一篇文章的方法來(lái)處理。完整的連接AutoCAD與C#的源程序如下所示:

using System;

using AutoCAD;

using System.Runtime.InteropServices;

namespace AcadExample

{

   public class AutoCADConnector : IDisposable

   {

      private AcadApplication _application;

      private bool _initialized;

      private bool _disposed;

      public AutoCADConnector()

      {

         try

         {

            // Upon creation, attempt to retrieve running instance

            _application = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16");

         }

         catch

         {

            try

            {

               // Create an instance and set flag to indicate this

               _application =  new AcadApplicationClass();

               _initialized = true;

            }

            catch

            {

               throw;

            }

         }

      }

      // If the user doesn't call Dispose, the

      // garbage collector will upon destruction

      ~AutoCADConnector()

      {

         Dispose(false);

      }

 

      public AcadApplication Application

      {

         get

         {

            // Return our internal instance of AutoCAD

            return _application;

         }

      }

             

      // This is the user-callable version of Dispose.

      // It calls our internal version and removes the

      // object from the garbage collector's queue.

      public void Dispose()

      {

         Dispose(true);

         GC.SuppressFinalize(this);

      }

 

      // This version of Dispose gets called by our

      // destructor.

      protected virtual void Dispose(bool disposing)

      {

         // If we created our AutoCAD instance, call its

         // Quit method to avoid leaking memory.

         if(!this._disposed && _initialized)

            _application.Quit();

           

         _disposed = true;        

      }

   }

}

利用Visual Studio.net 把上面的程序編譯成一個(gè)類(lèi)庫(kù),你就可以在以后的程序中使用它了,下面的這個(gè)例子說(shuō)明了它的用法。(首先把AcadExample類(lèi)庫(kù)包含在項(xiàng)目中)

using System;

using AcadExample;

using AutoCAD;

namespace ConsoleApplication6

{

   class Class1

   {

      [STAThread]

      static void Main(string[] args)

      {

         using (AutoCADConnector connector = new AutoCADConnector())

         {

            Console.WriteLine(connector.Application.ActiveDocument.Name);

         }

         Console.ReadLine();

      }

   }

}

這個(gè)例子是在C#窗口中顯示AutoCAD中當(dāng)前文檔的標(biāo)題。




主站蜘蛛池模板: 一二三四影院在线观看视频 | 五月婷婷综合基地 | 在线播放日本爽快片 | 四虎影院精品在线观看 | 伊人久久大香线蕉综合热线 | 伊人福利在线 | 最新中文字幕免费视频 | 日韩中文字幕高清在线专区 | 性欧美大战久久久久久久久 | 色综合91| 日韩免费专区 | 日韩黄色中文字幕 | 亚欧毛片基地国产毛片基地 | 小小bbwxxxx | 日韩精品久久不卡中文字幕 | 伊人蕉| 亚洲欧美综合一区二区三区四区 | 中文字幕在线不卡 | 亚洲欧美香蕉在线日韩精选 | 视频日韩| 日韩在线视频免费看 | 日本成人在线免费 | 伊人久久大香线蕉免费视频 | 日韩欧美高清视频 | 一本到视频 | 五月婷婷丁香在线视频 | 四虎免费在线观看 | 婷婷色六月 | 一二三四影视在线观看免费视频 | 性欧美人与物videos另类 | 四虎影视免费永久在线观看 | 伊人tv | 一级毛片成人免费看免费不卡 | 日本福利视频一区 | 日本高清视频在线观看 | 一区二区视频在线播放 | 欧美特黄a级高清免费看片 欧美特黄a级高清免费大片 | 天天爽天天色 | 日本网站在线看 | 中文字幕日本不卡 | 日本a级三级三级三级久久 日本a级片在线播放 |