反编译示例:mxd检查

简介: gisoralce在博客园发布了一个mxd检查工具,主要功能是将arcgis的mxd数据源有效性(含矢量和影像)检查、检查是否为相对路径,自动保存为相对路径。 这是一个未加壳的.NET程序,正好拿来练习,但无意侵犯gisoralce,望见谅! 首先使用dotPeek直接打开Mxdcheck.

gisoralce在博客园发布了一个mxd检查工具,主要功能是将arcgis的mxd数据源有效性(含矢量和影像)检查、检查是否为相对路径,自动保存为相对路径。

这是一个未加壳的.NET程序,正好拿来练习,但无意侵犯gisoralce,望见谅!

首先使用dotPeek直接打开Mxdcheck.exe

右键导出为VS项目文件:

由于VS版本的问题(测试使用VS2010),需要进行自动转换

问题一:警告:设计器无法处理AutoScaleMode.Font

打开主界面,出现警告"设计器无法处理第 248 行的代码:this.AutoScaleMode = AutoScaleMode.Font;方法"InitializeComponent"内的代码由设计器生成,不应手动修改。请移除任何更改,然后尝试重新打开设计器。

处理方法是,在前面添加完整引用,必须只能这样,不知道为什么。

问题二:变量"groupBox1"未声明或从未赋值

再打开界面,又警告:变量"groupBox1"未声明或从未赋值。

而转到定义发现定义过,不知道为什么!没办法报着尝试心理,我把groupBox1全部替换成groupBox3(因为已存在groupBox2),居然还可以了,没有任何警告了!

终于可以看到界面了……

问题三:ArcGIS product not specified

调用运行,出现了老问题,未进行Runtime绑定

在代码主函数中加一句:

ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

问题四:80040154

这是因为测试电脑是64位系统,需要将项目属性中,目标平台改为x86

问题五:所有都找不到数据源

终于可以正常运行和检查了。这个界面还是有点不美观,我自己写了一个界面,但运行检查所有的图层都找不到数据源!!明明是一样的代码,真是比较诡异!

原来是忘记了最重要的一步,没有进行权限许可:

IAoInitialize m_AoInitialize = new AoInitializeClass();

esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;

licenseStatus = m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);

终于搞定了。

核心函数:

        private void Checkonemxd(string mxdFile)
        {
            //1.打开文档
            IMapDocument document = new MapDocumentClass();
            document.Open(mxdFile, "");
            
            //2.检查路径
            if (this.ckbSave.Checked && !document.UsesRelativePaths)
            {
                this.rtbLog.Text = this.rtbLog.Text + "相对路径:" + mxdFile + "\n";
                document.Save(true, true);
            }

            //3.检查数据源
            int num = document.MapCount;
            for (int i = 0; i < num; i++)
            {
                IEnumLayer layers = document.get_Map(i).get_Layers(null, true);
                layers.Reset();
                ILayer layer;
                while ((layer = layers.Next()) != null)
                {
                    //string text;
                    if (layer is IFeatureLayer)
                    {
                        IFeatureLayer pFeatureLayer = layer as IFeatureLayer;
                        if (pFeatureLayer.FeatureClass == null)
                        {
                            RichTextBoxEx expr_C8 = this.rtbLog;
                            string text = expr_C8.Text;
                            expr_C8.Text = string.Concat(new string[]
                            {
                                text,"文件:",mxdFile,"的图层:", layer.Name,",找不到矢量数据源\n"
                            });
                        }
                    }
                    else if (layer is IRasterLayer)
                    {
                        IRasterLayer pFeatureLayer2 = layer as IRasterLayer;
                        if (pFeatureLayer2.Raster == null)
                        {
                            RichTextBoxEx expr_154 = this.rtbLog;
                            string text = expr_154.Text;
                            expr_154.Text = string.Concat(new string[]
                            {
                                text,"文件:",mxdFile,"的图层:",layer.Name,",找不到影像数据源\n"
                            });
                            text = this.rtbLog.Text;
                            this.rtbLog.Text = text + "文件:" + mxdFile + "的图层:" + layer.Name + ",找不到影像数据源\n";
                        }
                    }
                }
            }

            //4.关闭文档
            document.Close();
            document = null;
        }

  

目录
相关文章
|
2月前
|
JavaScript 前端开发
新建全局代码片段==》输入自定义文件名称
要在文本编辑器中创建和使用自定义代码片段,请按照以下步骤操作:首先通过设置菜单进入用户代码片段选项,并新建一个全局代码片段文件,输入自定义文件名。随后,在新创建的文件中定义代码片段,包括指定片段名称、适用范围、触发前缀、代码主体及描述。例如,“myscript”片段可设置前缀为“myscript”,并在各类文件中自动生成`&lt;script&gt;`标签。通过这种方式,可以快速插入常用的代码结构,提高编程效率。
27 1
|
27天前
|
Python
Python实用记录(十二):文件夹下所有文件重命名以及根据图片路径保存到新路径下保存
这篇文章介绍了如何使用Python脚本对TTK100_VOC数据集中的JPEGImages文件夹下的图片文件进行批量重命名,并将它们保存到指定的新路径。
32 0
|
3月前
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
44 0
|
4月前
|
Java
Error:java: 错误: 无效的源发行版:13, 类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。
Error:java: 错误: 无效的源发行版:13, 类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。
|
JavaScript
tsc : 无法将“tsc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
tsc : 无法将“tsc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
tsc : 无法将“tsc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
|
C#
C# .Resx文件无效解决方案 Resx文件报错解决方法
C# .Resx文件无效解决方案 Resx文件报错解决方法
841 7
C# .Resx文件无效解决方案 Resx文件报错解决方法
WIN10文件名排序错误的案例截图
WIN10文件名排序错误的案例截图
93 0
WIN10文件名排序错误的案例截图
编译好的编译ffmpeg又出错:更改输出目录产生各种古怪错误
编译好的编译ffmpeg又出错:更改输出目录产生各种古怪错误
99 0
|
JSON 数据格式
关于 Qt使用QJsonObject解析超范围整数的时候提取value失败 的解决方法
关于 Qt使用QJsonObject解析超范围整数的时候提取value失败 的解决方法
关于 Qt使用QJsonObject解析超范围整数的时候提取value失败 的解决方法