我有一些代码使用COM公开的第三方库(ArcObjects).所以例如有-interface IGeometry
.
IGeometry geometry = GetGeometry();
Run Code Online (Sandbox Code Playgroud)
现在,当我想查看对象成员时,我打开了一个QuickWatch:
我已经阅读了几个问题,这些问题都指向Visual Studio 2015中的"启用本机代码调试"选项.我已经启用该选项无济于事.
如何让调试器公开COM对象的成员?
编辑:当使用VS2010和.NET 3.5时,这适用:
在这个相关的问题中,我注意到Visual Studio的调试器能够枚举System.__ComObject
引用的属性,这是"当包装器类型不明确时使用的隐藏类型" - 例如,当您从另一个获取它时获得的对象类型COM对象,不要自己实例化它:
此外,如果您只是将COM对象的标识符写入立即窗口,其属性和值将被类似地转储:
请注意,这与VS2010的" 动态视图 " 是分开的,我认为它使用IDispatch
COM反射来枚举COM对象的属性,而不使用PIA和.NET反射.我正在使用的对象没有实现IDispatch
(也没有实现IProvideClassInfo
),因此,"动态视图"无法获取有关它们的任何信息:
有趣的是,SharpDevelop的调试器无法列出System.__Comobject
s(例如point.Envelope
)的成员,只能列出强类型的RCW(例如point
).
那么Visual Studio如何才能做到呢?
我相信在这种情况下,这是因为主互操作程序集存在这些对象支持的接口的定义,并且Visual Studio可能使用反射来枚举支持的接口和属性.那是准确的吗?如果是这样,它是如何工作的?
对于初学者,它如何访问PIA?它只查看当前加载的PIA还是动态加载它们(如果是,如何)?它如何确定哪个界面可以有多个枚举属性?它似乎只使用一个,而不一定是第一个.从我正在使用的API(ArcObjects)的文档中,这些对象的默认接口是IUnknown
,所以它不仅仅使用默认接口.
在屏幕截图的示例中,它枚举成员的IEnvelope
接口是接口,它继承自IGeometry
接口.VS2010如何知道不会枚举成员IGeometry
,在我的测试中,如果你只是枚举PIA中的所有接口类型,它首先出现?一些非常聪明的事情或者我错过了一些明显的东西?
我问的原因是LINQPad 的开发人员似乎愿意实现相同的功能,如果他知道VS如何做到这一点.所以这里一个好的答案可以帮助改进这个非常受欢迎的工具.
我在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)
我希望有人可以向我提供这个错误的解释,也可以解决我的问题.
出了什么问题?
我在测试具有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) 我们的部门有两位新的GIS程序员/分析师(编程和ArcObjects的新手),我觉得我没有足够的资格或没有时间教他们.所以我正在寻找入门级书籍/教程供他们作为参考.
我可以找到用于开发ArcMap扩展的唯一书籍是为VBA编写的.
除了您从Redlands的培训中获得的ESRI课程书籍之外,是否有人知道学习在.Net中对ArcObjects进行编码的良好来源?
谢谢
我正在尝试使用vba/arcobjects枚举文件地理数据库的内容(要素类和要素数据集,对表格不感兴趣等).
我将文件GDB设置为IGxDatabase对象,但无法找到进一步的方法.我已经查看了地理数据库对象模型并尝试使用IFeatureClass和IFeatureDataset,但似乎都没有返回有用的结果.
在此先感谢您的任何帮助
标题基本上都说明了一切.在我的情况下,我有一条折线,我必须找出它是多部分还是单部分.
一般而言,整个互联网(通过谷歌搜索),特别是ESRI的在线资料,已经证明在这个主题上相当中立.有一些希望在这里.以下复制的相关摘录:
您可以分别使用PathCount或RingCount属性确定折线中的路径数或多边形中的环.使用重载的GetPoint方法在特定路径或环中的特定位置获取Point的副本.以下代码示例使用PathCount,PointCount和GetPoint成员遍历Polyline,multiPathLine中的所有点:
Run Code Online (Sandbox Code Playgroud)// 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); } }
看起来很有希望,在这个漫长的页面上没有任何地方可以告诉潜在的开发者什么类型multiPathLine
.所以我去寻找难以捉摸的PathCount
财产,但它仍然没有.
我正在开发一个.NET应用程序,用于处理通过ESRI自己的.NET互操作程序集使用ESRI的ArcObjects COM库的地理数据.
在生产中运行时,由于达到每个进程2GB的内存限制,进程在某些操作期间可能会崩溃.(ArcObjects是一个32位库.)这是因为某些处理步骤可以创建许多临时ArcObjects几何对象.尽管使用FinalReleaseComObject
和关联的辅助方法手动释放这些对象,它仍会泄漏内存并最终耗尽内存.但是,我可以强制GC通过调用释放内存WaitForPendingFinalizers
,并定期调用它GC.Collect
并FinalReleaseComObject
保持内存使用受控制.否则,许多对象将保留在内存中,直到进程退出(正常或异常).
第一个问题:为什么不立即释放ArcObjects COM对象所占用的内存?或者,为什么GC允许进程崩溃而不是最终确定已发布的COM对象并在崩溃之前回收内存?
该应用程序在Windows 2008 64位上运行,而我使用Windows 7 32位开发.我可以让生产盒上的进程崩溃,但不能在我的开发盒上崩溃.我认为这可能是因为本地我通常在Visual Studio中使用Debug构建运行,但我也尝试使用Release版本而没有调试器(Start Without Debugging),但即便如此,它也没有在任何地方使用内存与生产中一样,不会崩溃.
第二个问题:为什么?
编辑:在我以前的实验中,我发现它GC.Collect
本身是不够的,即使我明确地称之为它.我有一个实用程序方法,在每次算法迭代后调用GC.Collect
后跟GC.WaitForPendingFinalizers
并调用它,以减少内存使用量.
如何将IFeatureClass对象序列化为XML?
在其他ArcObjects上使用IXMLSerializer有一些资源,但这对IFeatureClass不起作用,因为它没有实现ISerializable.
无法将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 ..
arcobjects ×10
c# ×4
esri ×4
arcgis ×3
com ×3
.net ×2
arcmap ×2
com-interop ×1
linqpad ×1
memory-leaks ×1
mocking ×1
rhino-mocks ×1
vba ×1