我使用下面的代码来使用autocad对象。
Dim acadapp As AcadApplication
acadapp = GetObject(, "AutoCAD.Application")
'''并使用下面的代码创建对象-------------
acadapp = CreateObject("AutoCAD.Application")
获取错误“无法创建ActiveX组件”。 我尝试使用18,19和各种组合如下:
acadapp = GetObject(, "AutoCAD.Application.18")
但没有任何效果。 请帮忙。
@Locke:谢谢你的回复。我尝试了你的解决方案如下:
Dim acadType As Type
Try
acadapp =
System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application.18.1")
''Above code din't worked so tried below code also
' acadapp = DirectCast(Marshal.GetActiveObject("AutoCAD.Application.18.1"),
'AcadApplication)
Catch ex As Exception
acadType = Type.GetTypeFromProgID("AutoCAD.Application")
acadapp = DirectCast(Activator.CreateInstance(acadType, True), AcadApplication)
End Try
显示例外:
无法将“System .__ ComObject”类型的COM对象转换为接口类型“AutoCAD.AcadApplication”。此操作失败,因为由于以下错误,对IID为“{8E75D910-3D21-11D2-85C4-080009A0C626}”的接口的COM组件的QueryInterface调用失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))
答案 0 :(得分:1)
这是我在处理AutoCAD互操作时通常使用的内容。它会检查正在运行的实例,并在必要时创建一个新实例:
private static AcadApplication GetAcadApp(string progId)
{
// Create the return application
AcadApplication returnApp = null;
try
{
// Try getting a running instance
returnApp = (AcadApplication)Marshal.GetActiveObject(progId);
}
catch (COMException)
{
try
{
// Try creating a new instance
Type acadType = Type.GetTypeFromProgID(progId);
returnApp = (AcadApplication)Activator.CreateInstance(acadType, true);
}
catch (COMException)
{
// Report failure
MessageBox.Show(string.Format("Cannot create object of type \"{0}\"", progId));
}
}
// Return the application
return returnApp;
}
可以像这样设置AcadApplication COM对象:
// Get/create an AutoCAD instance
var acadApp = getAcadApp("AutoCAD.Application.18");
无论使用C#还是VB.NET,使用Marshal.GetActiveObject和Activator.CreateInstance可能是更好的方法。
答案 1 :(得分:1)
根据异常,问题不在于GetActiveObject()调用,而是返回的对象不支持您正在寻找的接口。最有可能的原因是您的代码引用了不同版本的AcadApplication而不是您从GetActiveObject()获取的版本。更改项目以引用返回的AutoCAD实例的COM库版本,它应该可以正常工作。