介绍: 我试图通过autocad .net API创建一个在autocad中使用的自定义控件。
我已经创建了UC的基本设计,并决定将其中的一些元素组合在一个自定义UC中,稍后将其称为主UC。 (基本上是代码管理,组织......让我有这样的代码结构:
UC(顶部) - 由少数定制儿童UC组成 这些子UC中的每一个都包含几个按钮和组合框。
到目前为止很简单......在那些子UC中,我调用了一个简单的ACAD方法/对象。
当我尝试将其中一个子UC添加到主UC时出现问题。 我得到了一个" CLR错误" (附上图片)。
https://s32.postimg.org/6gnt3sgz9/why_no_work.jpg
我尝试过几种解决问题的方法; 1)使用自定义控件而不是UC 2)试图清除解决方案,重建解决方案。 3)尝试创建一个单独的类,从UC代码外部调用ACAD方法
基本上,我所学到的是,如果我从用户创建的事件(例如按钮点击,...)中运行代码,我可以(某种方式)让程序运行,但是如果我尝试从UC构造函数中调用acad命令,或UC_Load事件方法,当我尝试添加childUC时,我最终得到CLR错误(通过VSdesigner,如果我通过代码添加它,当我尝试调用时,我最终会引发错误设计师)
如果没有别的,我想知道为什么代码的行为会有所不同,这取决于代码是否来自" UC_load"或" button_clicked"。
这是我的代码:
public partial class child : UserControl
{
public child()
{
InitializeComponent();
//if I initialize doc here, I get the error
}
private void child_Load(object sender, EventArgs e)
{
//if I initialize doc here, I get the error
}
private void button1_Click(object sender, EventArgs e)
{
//it works here, but Im unsure why
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
}
}
" Document doc = .....是生成错误的行;
这是错误的图像和解决方案。 当我将子对象传递给设计者时,或者在我添加"子对象"之后打开设计器之前,会出现错误。从代码。
使用C#acad 2017,VS2015,x64
答案 0 :(得分:2)
在您创建表单时是否会发生这种情况,对吧?
这可能发生在VS尝试加载对象(在您的情况下是AutoCAD Document对象)时,这是不可能的,但也可能发生在VS为32且AutoCAD引用为64时。请考虑使用来自ObjectARX SDK,因为这些DLL只是方法存根。
我建议(作为最佳做法)不要在表单中使用AutoCAD对象,而是将UI和biz逻辑分开。 UI和商业逻辑的分离至少有一个纯粹基于UI组件的类(例如Windows.Form命名空间),另一个实现实际AutoCAD命令的类(即AcMgd.dll& AcCoreMgd.dll对象)和最后,数据层(即AcDbMgd.dll对象)