C#的小白,查阅网上资料也是不怎么全,特此记录;
【参考文档】
- 官方文档 https://ardupilot.org/dev/docs/building-mission-planner.html#building-mission-planner
- MissionPlanner编译与修改方法 http://www.nufeichuiyun.com/?p=76
- 采用 Visual Studio 编译 Mission Planner 方法与问题总结https://blog.csdn.net/hailiannanhai/article/details/78171546
源码下载地址:https://github.com/ArduPilot/MissionPlanner
Mission Planner上位机软件:http://firmware.ardupilot.org/Tools/MissionPlanner/MissionPlanner-latest.msi
编译环境:win10 + visual studio 2019
vs安装需要的库
- “ASP.NET and web development”
- “Universal Windows Platform developement”
- “Mobile development with .NET”
- “.NET Core cross-platofrm developement”
- “.NET desktop development”
1、预先安装最新的Mission Planner软件,需用到一些依赖的动态库
2、“文件” -> “打开” -> “项目/解决方案” ,选择刚下载的文件夹下的“MissionPlanner.sln”
3、右键点击 Mission Planner工程(注意前面有C#图标的工程),点击【属性】、选择【引用路径】、将已经安装的Mission Planner路径填进去,点击添加文件夹;
点击上图中的【生成事件】,移除所有“预先生成事件命令行“和”后期生成事件命令行“的内容;点击上图中的【生成】,将配置改为”Active(Debug)”
4、删除项目中 的 <ProjectReference Include="..\mono\mcs\class\System.Windows.Forms\System.Windows.Forms-net_4_x.csproj" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
5、删除MissionPlanner\ExtLibs\AltitudeAngelWings.csproj中<TargetFrameworks>net461;netcoreapp3.1;netstandard2.0</TargetFrameworks>的netstandard2.0因为很多命名空间中不存在对应的类型;
同理还有以下项目中的netstandard2.0
- BSE.Windows.Forms.csproj
- BaseClasses.csproj
- GMap.Net.WindowsForms.csproj
- OSDConfigurator.csproj
- ZedGraph.csproj
- MissionPlanner.Controls.csproj
6、如果遇到命名空间 system.windows 中不存在类型或命名空间名称 forms (是否缺少程序集引用 )”错误,则右键项目 --->添加-->程序集引用
执行以上操作后,清理项目再重新生成,如果还有错,则点击错误提示进入对应的cs文件,等几秒后错误就消失了(具体原因未知)
7、删除Updater项目的生成后执行命令行,以解决签名错误的问题;
8、解决错误:vs使用简体中文(gb2312)编码加载文件;解决方案:UTF-8编码打开文件
参考https://blog.csdn.net/qq_42974800/article/details/94590512
9、解决错误: 非字符串资源要求在运行时使用 System.Resources.Extensions 程序集,但未在此项目的引用中找到它。
工具-》Nuget包管理工具-》管理解决方案的Nuget程序包,在已安装里搜索System.Resources.Extensions,
如果已安装,则更新MissionPlanner.Controls的依赖版本;
没安装的话,打开程序包管理控制台输入:
Install-Package System.Resources.Extensions -Version 4.6.0
进行安装,再同上更新版本;
此处更新一下,需要用4.6.0的版本,不然后续运行会报错 A Major error has occured: 未能加载文件或程序集“System.Resources.Extensions Version=4.0.0.0”(虽然也不是很确定是不是这个的问题,不过折腾很久,最后这里的版本改了就好了。。。)
具体错误如下:
10、配置安卓SDK
点击错误提示自动下载更新sdk28(安卓9.0),安装完毕后,进入UsbSerialForAndroid项目,右键,属性,更改目标框架为Android 9.0;
11、解决错误:ConcurrentDictionary<int, uavcan.uavcan_protocol_NodeStatus>”未包含“Remove”的定义,并且找不到可接受第一个“ConcurrentDictionary<int, uavcan.uavcan_protocol_NodeStatus>”类型参数的可访问扩展方法“Remove”(是否缺少 using 指令或程序集引用?) UAVCANFlasher
点击对应的错误说明,进入文件后做如下修改:
uavcan.uavcan_protocol_NodeStatus value;
can.NodeList.TryRemove(lastseenDateTime.Key, out value);
// can.NodeList.Remove(lastseenDateTime.Key)