属性" ******** "的代码生成失败.错误是:"程序集"********.Version=1.0.0.0,Culture=neutral,..........无标记为序列化""](转)...

开发时在做UserControl,需要注意的List<>集合问题~~~!

其他类型的集合可能也存在这样的问题,但是我没去测试,在写集合的时候一般List<>用的多点,所以经常碰到以下错误:

提示:属性" ******** "的代码生成失败.错误是:"程序集"********.Version=1.0.0.0,Culture=neutral,..........无标记为序列化""]

例如下面一个MyUserControl,其中写了一个List<>属性

 

[csharp]  view plain  copy
 
  1. public partial class MyUserControl : UserControl  
  2.  {  
  3.     public MyUserControl()  
  4.    {  
  5.      InitializeComponent();  
  6.      m_ReceiverList = new List<DuxUser>();  
  7.    }  
  8.   
  9.     public MyUserControl(List<DuxUser> receiverlist)  
  10.    {  
  11.      InitializeComponent();  
  12.      m_ReceiverList = receiverlist;  
  13.    }  
  14.  
  15.    #region Properties  
  16.   
  17.    private List<DuxUser> m_ReceiverList=null;  
  18.    public List<DuxUser> ReceiverList  
  19.    {  
  20.      get { return m_ReceiverList; }  
  21.      set  
  22.      {  
  23.        m_ReceiverList = value;  
  24.      }  
  25.    }  
  26.    #endregion  
  27.  }  
  28.   
  29.  public class DuxUser     //定义的一个DuxUser类  
  30.  {  
  31.    public DuxUser() { }  
  32.  }  


这个MyUserControl代码看起来时没有任何问题的,但是只要你往窗体上一拖就是报上面红色字体的错误,如果你是写代码添加到窗体上是不会出错的,只要拖到窗体上去就会报错!

 

为什么会这样呢?

例如: 把一个MyUserControl控件拖到一个Form1上,那么Form1.Designer.cs里就会出现这么一条代码:

this.myUserControl1.ReceiverList = 

((System.Collections.Generic.List<DuxUser>)(resources.GetObject("myUserControl1.ReceiverList")));

这段代码就是错误的根源,因为DuxUser类没有标记为可序列化 [Serializable],所以List<DuxUser>也就不能序列化啦!

为什么Form1.Designer.cs中会有那么一段代码呢,原因在MyUserControl的无参数构造函数上:

m_ReceiverList = new List<DuxUser>();

 

我们在做集合的时候,一般都会给他实例化一下,这样可以避免调用控件的集合Add() 或者 Remove,foreach 等操作的时候出现Null值异常!

但是就是这段代码,Form1.Designer.cs文件中自动生成了那么一段怪代码,导致出错

解决的办法有3种:

1. 无参数构造方法中 m_ReceiverList=null 或者不写; 然后再Load事件中进行初始化),那么在Form1.Designer.cs中看到的就是this.ReceiverList = null;

    需要注意的是:Load事件中要判断集合是否为null值,是null才去初始化,因为有可能是手动写代码添加到容器(如:窗体),而不是拖,写代码的方式有可能在Load之前给集合属性赋值

2. 把DuxUser类,标记为可序列化的类[Serializable]

[csharp]  view plain  copy
 
  1. [Serializable]  
  2. public class DuxUser  
  3. {  
  4.   public DuxUser() { }  
  5.     
  6.   //.........  
  7. }  

3. 如下:

[csharp]  view plain  copy
 
  1. private List<DuxUser> m_ReceiverList=null;  
  2.   
  3. [Bindable(false), Browsable(false)]  
  4. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]  
  5. public List<DuxUser> ReceiverList  
  6. {  
  7.   get { return m_ReceiverList; }  
  8.   set  
  9.   {  
  10.     m_ReceiverList = value;  
  11.   }  
  12. }  

想看到下面这段代码,请选择第二种方法(把类[DuxUser]标记为可序列化):

this.myUserControl1.ReceiverList = ((System.Collections.Generic.List<DuxUser>)(resources.GetObject("myUserControl1.ReceiverList")));

第一:写在这里是为了做笔记..(好记性不如烂笔头)

第二:愿有缘人找到此代码,以免出来问题束手无策.....

 

 

在使用编写完成的用户控件时,有时会现理某某属性代码生成失败,程序集未标记为可序列化,解决方法参考另一位博主写的很好的

点击打开链接

我按照上面做还是没能解决问题,然后我想了一下,还要做如下工作

1、清理项目

2、重新添加项目间引用(如果需要)

3、删除该用户控件所在项目的bin和obj目录

4、关闭VS,重新生成

大功告成!

非常感谢 点击打开链接

 

转:http://blog.youkuaiyun.com/blogtjf/article/details/47098689

转:http://blog.youkuaiyun.com/wxm3630478/article/details/4295122

转载于:https://www.cnblogs.com/janeaiai/p/8144747.html

<think>根据用户描述,在AutoCAD中输入自定义命令(如MYCOMMAND)时提示“未知命令”,说明插件虽然存在,但命令并未成功注册。以下是针对此问题的全面排查和解决方案: ### 问题原因分析: 1. **命令名称不匹配**:PackageContents.xml中定义的命令与DLL中实际的命令名称不一致。 2. **命令类未正确标记**:DLL中的命令类未使用`CommandClass`特性标记。 3. **插件未完全加载**:虽然目录结构正确,但DLL可能由于依赖问题未能加载。 4. **权限或签名问题**:DLL未签名或签名错误导致被阻止加载。 --- ### 一、验证命令名称一致性(关键步骤) #### 1. **检查PackageContents.xml中的命令定义** ```xml <Commands> <Command Global="MYCOMMAND" Local="My Command" /> </Commands> ``` ➔ 此处`Global`属性值必须与DLL中`CommandMethod`特性的名称**完全一致**(包括大小写)。 #### 2. **检查C#代码中的命令定义** ```csharp using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; public class MyCommands { [CommandMethod("MYCOMMAND")] // 必须与XML中的Global值一致 public void MyCommand() { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage( "Command executed successfully!"); } } ``` > ⚠️ **注意**:AutoCAD默认**不区分大小写**,但建议保持完全一致。 --- ### 二、确保命令类被正确标记(适用于多类情况) 当项目中有多个命令类时,必须用`CommandClass`特性显式标记: ```csharp using Autodesk.AutoCAD.Runtime; // 关键:声明此程序集中的命令类 [assembly: CommandClass(typeof(MyNamespace.MyCommands))] ``` --- ### 三、验证DLL加载状态 在AutoCAD中执行: ```lisp (arx) ; 查看已加载的ARX模块 (ver) ; 查看.NET运行库版本 ``` 若未找到您的DLL,则说明加载失败。使用以下命令手动加载: ```lisp (netload "完整路径/MyPlugin.dll") ``` 观察错误信息(如依赖缺失)。 --- ### 四、处理强签名问题(常见拦截原因) #### 1. 生成强名称密钥: ```bash sn -k mykey.snk ``` #### 2. 在项目中引用密钥: ```xml <PropertyGroup> <SignAssembly>true</SignAssembly> <AssemblyOriginatorKeyFile>mykey.snk</AssemblyOriginatorKeyFile> </PropertyGroup> ``` #### 3. 重新编译后,检查程序集签名: ```bash sn -T MyPlugin.dll ``` ➔ 应返回公钥令牌。 --- ### 五、依赖项处理 将依赖的DLL放在以下位置: - 与主DLL同一目录(`x64/`下) - 或通过`<PrivateDependencies>`在PackageContents.xml中声明: ```xml <PrivateDependencies> <Dependency Name="Newtonsoft.Json" Version="13.0.0" /> </PrivateDependencies> ``` --- ### 完整解决方案代码示例 #### 1. C# 命令实现 (MyCommands.cs) ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; [assembly: CommandClass(typeof(MyPlugin.MyCommands))] namespace MyPlugin { public class MyCommands { [CommandMethod("MYCOMMAND", CommandFlags.Session)] public void MyCommandMethod() { var doc = Application.DocumentManager.MdiActiveDocument; doc.Editor.WriteMessage("\nMyPlugin loaded successfully!"); } } } ``` #### 2. PackageContents.xml 配置 ```xml <?xml version="1.0" encoding="utf-8"?> <ApplicationPackage SchemaVersion="1.0" AppVersion="1.0" ProductCode="{8A1F3B2D-4C5D-46E7-9D1A-7B1234567890}" Name="MyPlugin" Description="Sample Plugin"> <RuntimeRequirements OS="Win64" Platform="AutoCAD" SeriesMin="R24.0" SeriesMax="R24.3" /> <Components> <ComponentEntry ModuleName="./x64/MyPlugin.dll" AppType=".NET" LoadOnCommandInvocation="True"> <Commands> <!-- 注意:此处Global值必须与C#中CommandMethod的名称一致 --> <Command Global="MYCOMMAND" Local="My Command" /> </Commands> </ComponentEntry> </Components> </ApplicationPackage> ``` --- ### 调试流程 1. **重新编译**:确保使用Release|x64配置 2. **复制到插件目录**: ``` %APPDATA%\Autodesk\ApplicationPlugins\MyPlugin.bundle ``` 3. **重启AutoCAD** 4. **测试命令**: ```lisp MYCOMMAND ``` --- §§相关问题§§: 1. 如何在AutoCAD插件中实现带参数的命令? 2. AutoCAD .NET API如何获取用户输入? 3. 如何为AutoCAD插件添加自定义菜单? 4. 如何调试AutoCAD .NET插件的加载过程?</think>### 问题分析与解决方案 当您在AutoCAD中输入`MYCOMMAND`命令时出现"未知命令"错误,表明插件已加载但命令注册失败。以下是系统性的排查和解决方案: --- ### 一、核心问题:命令未正确注册 #### 原因分析: 1. **命令名称不匹配**:PackageContents.xml中的命令声明与C#代码中的实际命令名称不一致 2. **命令类未标记**:未使用`[CommandClass]`特性标记命令类 3. **程序集签名问题**:未签名或签名无效导致AutoCAD拒绝加载 4. **依赖项缺失**:插件依赖的AutoCAD API版本不匹配 --- ### 二、完整解决方案 #### 步骤1:验证命令名称一致性 **PackageContents.xml** 必须与C#代码中的命令名称**完全匹配**(包括大小写): ```xml <ComponentEntry ModuleName="./x64/MyPlugin.dll" AppType=".NET"> <Commands> <!-- 确保这里的Global值与代码中的CommandMethod名称一致 --> <Command Global="MYCOMMAND" Local="My Command" /> </Commands> </ComponentEntry> ``` **C# 命令实现**: ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.EditorInput; // 必须添加CommandClass特性标记 [assembly: CommandClass(typeof(MyPlugin.MyCommands))] namespace MyPlugin { public class MyCommands { // CommandMethod特性中的名称必须与XML中的Global值匹配 [CommandMethod("MYCOMMAND")] public void MyCommand() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("\nMyPlugin command executed successfully!"); } } } ``` #### 步骤2:添加强名称签名(必需) AutoCAD要求所有.NET插件必须进行强名称签名: 1. 生成密钥文件: ```bash sn -k MyPluginKey.snk ``` 2. 在项目文件(.csproj)中添加: ```xml <PropertyGroup> <SignAssembly>true</SignAssembly> <AssemblyOriginatorKeyFile>MyPluginKey.snk</AssemblyOriginatorKeyFile> </PropertyGroup> ``` #### 步骤3:验证运行时依赖 确保项目引用正确的AutoCAD API版本: ```xml <!-- MyPlugin.csproj --> <ItemGroup> <!-- AutoCAD 2023/2024 使用版本24.0.0.0 --> <Reference Include="acdbmgd" HintPath="C:\Program Files\Autodesk\AutoCAD 2024\acdbmgd.dll" /> <Reference Include="accoremgd" HintPath="C:\Program Files\Autodesk\AutoCAD 2024\accoremgd.dll" /> </ItemGroup> ``` #### 步骤4:添加详细的加载日志 在插件中添加初始化日志记录: ```csharp using System; using Autodesk.AutoCAD.Runtime; namespace MyPlugin { public class PluginLoader : IExtensionApplication { public void Initialize() { try { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("\nMyPlugin initialized successfully!"); // 测试命令注册 ed.WriteMessage("\nRegistered commands: MYCOMMAND"); } catch (Exception ex) { // 将错误写入AutoCAD日志 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage( $"\nPLUGIN ERROR: {ex.Message}"); } } public void Terminate() { } } } ``` --- ### 三、调试流程 #### 1. 手动加载测试 在AutoCAD命令行执行: ```lisp ; 获取插件路径 (setq pluginPath (findfile "MyPlugin.bundle")) ; 手动加载DLL (netload (strcat pluginPath "\\Contents\\x64\\MyPlugin.dll")) ``` 观察错误信息输出 #### 2. 检查加载日志 在AutoCAD中查看文本窗口(按F2)是否有初始化消息 #### 3. 使用Fusion Log查看器 捕获.NET程序集绑定失败信息: 1. 下载 [Fusion Log Viewer (fuslogvw.exe)](https://learn.microsoft.com/en-us/dotnet/framework/tools/fuslogvw-exe-assembly-binding-log-viewer) 2. 设置为记录所有绑定失败 3. 重现问题后查看日志 --- ### 四、完整解决方案验证 1. **项目结构验证**: ``` MyPlugin.bundle/ └── Contents/ ├── x64/ │ ├── MyPlugin.dll │ └── MyPlugin.pdb (调试文件) └── PackageContents.xml ``` 2. **PackageContents.xml 完整示例**: ```xml <?xml version="1.0" encoding="utf-8"?> <ApplicationPackage SchemaVersion="1.0" AppVersion="1.0" ProductCode="{8A1F3B2D-4C5D-46E7-9D1A-7B1234567890}" Name="MyPlugin" Description="Sample AutoCAD Plugin"> <RuntimeRequirements OS="Win64" Platform="AutoCAD" SeriesMin="R24.0" SeriesMax="R24.3" /> <Components> <ComponentEntry ModuleName="./x64/MyPlugin.dll" AppType=".NET" LoadOnCommandInvocation="True"> <Commands> <Command Global="MYCOMMAND" Local="My Custom Command" /> </Commands> </ComponentEntry> </Components> </ApplicationPackage> ``` 3. **编译后操作**: - 删除旧插件文件夹 - 复制新编译的插件到: ``` %APPDATA%\Autodesk\ApplicationPlugins\ ``` - 重启AutoCAD - 输入命令 `MYCOMMAND` --- ### 五、常见错误解决方案 | 错误现象 | 解决方案 | |---------|---------| | "无法加载程序集" | 检查.NET框架版本,确保为4.8 | | "命令未定义" | 验证[CommandMethod]名称与XML完全一致 | | "文件未找到" | 使用绝对路径手动netload测试 | | "安全错误" | 添加强名称签名并注册到GAC | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值