【问题标题】:Custom UserControl generates Common Language Runtime error when added to a parent UC自定义 UserControl 添加到父 UC 时生成公共语言运行时错误
【发布时间】:2016-07-15 16:14:49
【问题描述】:

简介: 我正在尝试通过 autocad .net API 创建一个在 AutoCAD 中使用的自定义控件。

我已经创建了 UC 的基本设计,并决定将它的一些元素分组到自定义 UC 中,然后将其调用到主 UC。 (基本上是用于代码管理、组织......给我留下这样的代码结构:

UC(top) - 由几个自定义子 UC 组成 每个子 UC 都由几个按钮和组合框组成。

到目前为止很简单......

在那些子 UC 中,我调用了一个简单的 ACAD 方法/对象。

当我尝试将这些子 UC 之一添加到主 UC 时出现问题。 我收到“CLR 错误”(附加图片)。

https://s32.postimg.org/6gnt3sgz9/why_no_work.jpg

我尝试了几种解决问题的方法; 1) 使用自定义控件而不是 UC 2)试图清除解决方案,重建解决方案。 3) 尝试创建一个单独的类,从 UC 代码外部调用 ACAD 方法

基本上,我学到的是,如果我从用户创建的事件(例如按钮单击,...)中运行代码,我可以(以某种方式)让程序工作,但如果我尝试调用 acad来自 UC 构造函数或 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

【问题讨论】:

    标签: wpf controls autocad


    【解决方案1】:

    这是在您创建表单时发生的,对吧?

    这可能发生在 VS 尝试加载对象(在您的情况下为 AutoCAD Document 对象)时,这是不可能的,但也可能发生在 VS 为 32 且 AutoCAD 引用为 64 时。考虑使用来自ObjectARX SDK,因为这些 DLL 只是方法存根。

    我建议(作为最佳实践)不要在表单中使用 AutoCAD 对象,而是将 UI 和 biz 逻辑分开。 UI 和 biz 逻辑的分离至少意味着有一个纯粹基于 UI 组件的类(例如 Windows.Form 命名空间),另一个实现实际 AutoCAD 命令的类(即 AcMgd.dll 和 AcCoreMgd.dll 对象),并且,最后是数据层(即 AcDbMgd.dll 对象)

    【讨论】:

    • 我从来没有编译过部分,在将一个 UC 添加到另一个 UC 时会发生错误。关键是将主 UC 添加到 acads GUI 中,它只接受 UC,而不是形成有趣的注意,当所有元素都在一个 UC 内时,一切都有效(Acad api 代码和 UC 逻辑)。但目前我决定将代码分成几个“子 UC”,出现错误。就像 VS 期望所有自定义 UC 内部都具有集成逻辑,当将它们添加到另一个 UC 时,他发现“松散的结局”,他不喜欢。您能否详细说明“分离的 UI 和业务逻辑”是什么意思?
    • 您是否将其添加到 PaletteSet?我对分离 UI 和 biz 逻辑的建议仍然适用,并且允许您在命令行上重用您的逻辑,例如
    • 完全正确。我将它添加到PS。我编辑了之前的评论。我尝试将 acad 部分分离到一个单独的类中,但是当我从该类/对象调用方法时,在 UC 构造函数或 UC_Load 中调用它时仍然出现错误。我不确定您所说的“分离 UI 和业务”是什么意思。你的意思是只是单独的类,或者将 biz 部分预编译为 dll,或者使用 sendstring 执行,或者我没有想到的第三种方法?
    • 我编辑回复。 VS 尝试实例化 Document 对象时可能会失败,这是不可能的。
    • 我已经尝试过尽可能干净地创建程序(分离类等),并且有几个我想尝试的概念,通过论证 UC(文档文档)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2017-05-05
    • 2011-05-05
    相关资源
    最近更新 更多