标签: arcobjects

启用本机代码调试以深入COM对象

我有一些代码使用COM公开的第三方库(ArcObjects).所以例如有-interface IGeometry.

IGeometry geometry = GetGeometry();
Run Code Online (Sandbox Code Playgroud)

现在,当我想查看对象成员时,我打开了一个QuickWatch:

在此输入图像描述

我已经阅读了几个问题,这些问题都指向Visual Studio 2015中的"启用本机代码调试"选项.我已经启用该选项无济于事.

如何让调试器公开COM对象的成员?

编辑:当使用VS2010和.NET 3.5时,这适用:

在此输入图像描述

c# com arcobjects visual-studio-2015

12
推荐指数
2
解决办法
895
查看次数

Visual Studio的调试器/交互式窗口如何在.NET中转储COM对象的属性?

在这个相关的问题中,我注意到Visual Studio的调试器能够枚举System.__ComObject引用的属性,这是"当包装器类型不明确时使用的隐藏类型" - 例如,当您从另一个获取它时获得的对象类型COM对象,不要自己实例化它:

COM对象调试视图

此外,如果您只是将COM对象的标识符写入立即窗口,其属性和值将被类似地转储:

COM对象立即窗口

请注意,这与VS2010的" 动态视图 " 是分开的,我认为它使用IDispatchCOM反射来枚举COM对象的属性,而不使用PIA和.NET反射.我正在使用的对象没有实现IDispatch(也没有实现IProvideClassInfo),因此,"动态视图"无法获取有关它们的任何信息:

动态视图

有趣的是,SharpDevelop的调试器无法列出System.__Comobjects(例如point.Envelope)的成员,只能列出强类型的RCW(例如point).

SharpDevelop调试器

那么Visual Studio如何才能做到呢?

我相信在这种情况下,这是因为主互操作程序集存在这些对象支持的接口的定义,并且Visual Studio可能使用反射来枚举支持的接口和属性.那是准确的吗?如果是这样,它是如何工作的?

对于初学者,它如何访问PIA?它只查看当前加载的PIA还是动态加载它们(如果是,如何)?它如何确定哪个界面可以有多个枚举属性?它似乎只使用一个,而不一定是第一个.从我正在使用的API(ArcObjects)的文档中,这些对象的默认接口是IUnknown,所以它不仅仅使用默认接口.

在屏幕截图的示例中,它枚举成员的IEnvelope接口是接口,它继承自IGeometry接口.VS2010如何知道不会枚举成员IGeometry,在我的测试中,如果你只是枚举PIA中的所有接口类型,它首先出现?一些非常聪明的事情或者我错过了一些明显的东西?

我问的原因是LINQPad 的开发人员似乎愿意实现相同的功能,如果他知道VS如何做到这一点.所以这里一个好的答案可以帮助改进这个非常受欢迎的工具.

com arcobjects com-interop visual-studio-2010 linqpad

9
推荐指数
1
解决办法
1167
查看次数

无法嵌入"ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass"

我在C#中添加了arcmap的应用程序,我尝试连接我的文件地理数据库.所以当我试图运行它时,我收到了这个错误:

Error 1 Interop type 'ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass' cannot be embedded. Use the applicable interface instead.  
Run Code Online (Sandbox Code Playgroud)

然后是添加的路径

我之前从未见过这个错误,我想知道出了什么问题.

这是它的主要代码:

 public IWorkspace FileGdbWorkspaceFromPropertySet(string database)
    {
        IPropertySet propertySet = new PropertySetClass();
        propertySet.SetProperty("DATABASE", database);
        IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
        return workspaceFactory.Open(propertySet, 0);
    }
Run Code Online (Sandbox Code Playgroud)

所以错误在这一行:

IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
Run Code Online (Sandbox Code Playgroud)

我希望有人可以向我提供这个错误的解释,也可以解决我的问题.

出了什么问题?

c# arcobjects esri arcgis

6
推荐指数
1
解决办法
2226
查看次数

Rhino.Mocks和ref参数

我在测试具有ref参数的方法时遇到问题.我不是库/代码所有者,所以我无法更改它,所以请不要建议我删除ref参数.

我使用这个网站作为参考:http: //ayende.com/wiki/Rhino%20Mocks%203.5.ashx#OutandRefarguments

这是测试:

    [Test]
    public void TestBuildSimpleProfile()
    {
        // arrange
        var barMock = MockRepository.GenerateStrictMock<ICommandBar>();
        var controlBuilder = new ControlBuilder(barMock);

        var user = new Usuario();
        user.PRF_PERFIS = new Perfis();

        var perfil = new Perfil();
        perfil.FNC_FUNCIONALIDADES = new Funcionalidades();
        var func1 = new Funcionalidade();
        func1.FNC_NU_ID = 1;
        func1.FNC_FL_ATIVO = true;
        func1.FNC_NO_CHAVE = "Associar Registros";
        func1.FNC_DE_FUNCIONALIDADE = "{0653aeac-c5ef-46fa-9e99-408719296ed3}";

        perfil.FNC_FUNCIONALIDADES.Add(func1);
        user.PRF_PERFIS.Add(perfil);

        var funcs = new List<IFunctionality>();
        funcs.Add(new FunctionalityAttribute(1,"Associar Registros", "{0653aeac-c5ef-46fa-9e99-408719296ed3}", "SGIGT", true,"admin,editor"));

        var uid = new UIDClass() { Value = "{0653aeac-c5ef-46fa-9e99-408719296ed3}" …
Run Code Online (Sandbox Code Playgroud)

c# rhino-mocks mocking arcobjects

4
推荐指数
1
解决办法
3302
查看次数

开发ArcMap扩展.Net书籍?

我们的部门有两位新的GIS程序员/分析师(编程和ArcObjects的新手),我觉得我没有足够的资格或没有时间教他们.所以我正在寻找入门级书籍/教程供他们作为参考.

我可以找到用于开发ArcMap扩展的唯一书籍是为VBA编写的.

除了您从Redlands的培训中获得的ESRI课程书籍之外,是否有人知道学习在.Net中对ArcObjects进行编码的良好来源?

谢谢

.net arcobjects esri arcmap

2
推荐指数
1
解决办法
3249
查看次数

ArcObjects - 枚举地理数据库中的要素类和数据集

我正在尝试使用vba/arcobjects枚举文件地理数据库的内容(要素类和要素数据集,对表格不感兴趣等).

我将文件GDB设置为IGxDatabase对象,但无法找到进一步的方法.我已经查看了地理数据库对象模型并尝试使用IFeatureClass和IFeatureDataset,但似乎都没有返回有用的结果.

在此先感谢您的任何帮助

vba arcobjects arcgis

2
推荐指数
1
解决办法
6825
查看次数

如何确定几何是否是多部分的?

标题基本上都说明了一切.在我的情况下,我有一条折线,我必须找出它是多部分还是单部分.

一般而言,整个互联网(通过谷歌搜索),特别是ESRI的在线资料,已经证明在这个主题上相当中立.有一些希望在这里.以下复制的相关摘录:

您可以分别使用PathCount或RingCount属性确定折线中的路径数或多边形中的环.使用重载的GetPoint方法在特定路径或环中的特定位置获取Point的副本.以下代码示例使用PathCount,PointCount和GetPoint成员遍历P​​olyline,multiPathLine中的所有点:

// Iterate through all points in all paths.
for (int i = 0; i < multiPathLine.PathCount; i++)
{
    for (int j = 0; j < multiPathLine.PointCount(i); j++)
    {
        multiPathLine.GetPoint(i, j);
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来很有希望,在这个漫长的页面上没有任何地方可以告诉潜在的开发者什么类型multiPathLine.所以我去寻找难以捉摸的PathCount财产,但它仍然没有.

arcobjects

2
推荐指数
1
解决办法
3608
查看次数

为什么在手动强制GC执行之前,已发布的ArcObjects COM对象尚未完成?

我正在开发一个.NET应用程序,用于处理通过ESRI自己的.NET互操作程序集使用ESRI的ArcObjects COM库的地理数据.

在生产中运行时,由于达到每个进程2GB的内存限制,进程在某些操作期间可能会崩溃.(ArcObjects是一个32位库.)这是因为某些处理步骤可以创建许多临时ArcObjects几何对象.尽管使用FinalReleaseComObject和关联的辅助方法手动释放这些对象,它仍会泄漏内存并最终耗尽内存.但是,我可以强制GC通过调用释放内存WaitForPendingFinalizers,并定期调用它GC.CollectFinalReleaseComObject保持内存使用受控制.否则,许多对象将保留在内存中,直到进程退出(正常或异常).

第一个问题:为什么不立即释放ArcObjects COM对象所占用的内存?或者,为什么GC允许进程崩溃而不是最终确定已发布的COM对象并在崩溃之前回收内存?

该应用程序在Windows 2008 64位上运行,而我使用Windows 7 32位开发.我可以让生产盒上的进程崩溃,但不能在我的开发盒上崩溃.我认为这可能是因为本地我通常在Visual Studio中使用Debug构建运行,但我也尝试使用Release版本而没有调试器(Start Without Debugging),但即便如此,它也没有在任何地方使用内存与生产中一样,不会崩溃.

第二个问题:为什么?

编辑:在我以前的实验中,我发现它GC.Collect本身是不够的,即使我明确地称之为它.我有一个实用程序方法,在每次算法迭代后调用GC.Collect后跟GC.WaitForPendingFinalizers并调用它,以减少内存使用量.

.net com garbage-collection memory-leaks arcobjects

2
推荐指数
1
解决办法
1308
查看次数

在ESRI ArcGIS中将FeatureClass序列化为XML

如何将IFeatureClass对象序列化为XML?

在其他ArcObjects上使用IXMLSerializer有一些资源,但这对IFeatureClass不起作用,因为它没有实现ISerializable.

arcobjects esri arcgis

1
推荐指数
1
解决办法
1851
查看次数

如何在ArcObjects中将ILayer转换为IPolygon

无法将Ilayer转换为IPolygon.

我正在为ArcMap开发一个工具栏,我通过侧面目录中的代码获取一个图层.图层是多边形,但代码不会将其转换为IPolygon.

谁能帮我吗?这是我用来尝试将其转换为IPolygon的代码...

 IPolygon poly = m_document.Maps.get_Item(0).get_Layer(0) as IPolygon;
Run Code Online (Sandbox Code Playgroud)

我可以做这个:

 ILayer layer = m_document.Maps.get_Item(0).get_Layer(0) as ILayer;
Run Code Online (Sandbox Code Playgroud)

这是有效的,只是不将它转换为IPloygon ..

c# arcobjects esri arcmap

1
推荐指数
1
解决办法
2715
查看次数