dg1 と dg2 の 2 つの図面があります。dg2 にコピーしたいブロック 'b1' を dg1 に定義しました。アーリー バインディングではうまく機能しますが、レイト バインディングでコードを試すとエラーが発生します。問題のコードは次のとおりです。
private void Form1_Load(object sender, EventArgs e)
{
AcadApplication m_oAcadApp = null;
AcadCircle circle = null;
AcadAcCmColor color = null;
AcadDocument oSourceFile = null;
AcadDocument m_oActiveDoc = null;
try
{
object obj = Marshal.GetActiveObject("AutoCAD.Application.17");
if (obj != null)
{
m_oAcadApp = obj as AcadApplication;
m_oActiveDoc = m_oAcadApp.ActiveDocument;
foreach (AcadDocument oTempDoc in m_oAcadApp.Documents)
{
if((@"c:\d1.dwg").ToUpper() == oTempDoc.FullName.ToUpper())
{
Console.WriteLine(oTempDoc.FullName);
oSourceFile = oTempDoc;
break;
}
}
try
{
object[] objCollection = new object[1];
objCollection[0] = null;
objCollection[0] = oSourceFile.Blocks.Item("b1");
oSourceFile.CopyObjects(objCollection, m_oActiveDoc.Blocks);
}
catch (Exception ex)
{
MessageBox.Show("Opening Blocks " + ex.Message);
}
/*double[] cen = new double[] { 0, 0, 0 };
circle = m_oAcadApp.ActiveDocument.Database.ModelSpace.AddCircle(cen, 2);
color = m_oAcadApp.GetInterfaceObject("Autocad.AcCmColor.17") as AcadAcCmColor;
color.SetRGB(150, 150, 250);
circle.TrueColor = color;
m_oAcadApp.ZoomExtents();
* */
}
}
catch (Exception ex)
{
MessageBox.Show("AutoCAD not opened");
}
finally
{
// if (color != null) Marshal.FinalReleaseComObject(color);
//if (circle != null) Marshal.FinalReleaseComObject(circle);
if (m_oAcadApp != null) Marshal.FinalReleaseComObject(m_oAcadApp);
}
}
そして、例外が発生します:他の図面でブロックをコピーしようとすると、無効なオブジェクト配列例外が発生します。
レイトバインディングでどうすればいいですか?
Autocad2009を使用しています。
Autocad の Late Binding とオブジェクトのコピーを実装する目的
ありがとう