ArcObject类库的AO参考类库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArcObject类库的AO参考类库相关的知识,希望对你有一定的参考价值。

参考技术A

(ArcObjects library reference)
AO的参考类库对于AE开发者以及DESKTOP和SERVER是一样的。每个AO库都像是一个.NET程序集。因此,本文的余下部分按照.NET的风格来引述这些类库。
每个程序集同其它程序集之间都是独立的,知道这一点很重要。因为这影响程序员在开发软件时同程序集之间的交互。理解独立性也能在发布成果时有所帮助。
1.system
ArcGis构架中最低层的类库。此程序集中包含的组件为其它组成ArcGis的类库提供服务。
2.SystemUI
定义ArcGis系统中的用户界面组件使用的类型。接口如ICommand和ITool都定义在此程序集内。实现这些类型通常在一个或多个更高级的库中完成
3.ADF assembly
提供.NET基类,组件类别唯一ID(CATIDS),以及先前在UTILITY程序集中提供的实体类。
4.Utility
在9.2版本之前遭受批评。大多数功能先转移到新的ADF程序集中了。
部署提示:你仍然可以使用UTILITY类发布程序,并且任何参考他们的项目会继续正常运行;然而,注意UTILITY现在被反对,并且在以后的版本中将全部移除。
5.Geometry
包含核心几何对象,比如点、多边形、折线,等等。以及几何类型和定义。Geometry程序集也为投影系统和地理坐标系统定义和实现空间参考对象。
6.Display
包含支持绘制符号到输出设备的组件。屏幕显示,符号,颜色和反馈对象,并且他们支持的所有对象都在这个程序集中定义了。
7.Server
包含获取ArcGIS Server连接的对象. 这个连接通过此类库中的e对象来管理,但其它类库中的对象能通过使用server对象的函数来创建。
8.Output
包含需要生成输出的对象,大部分都是MAPS和PAGELAYOUTS,到打印机和绘图仪以及输出到文件。
9.GeoDatabase
包含所有关于数据获取的定义类型。要素,表格,网络,TIN都在GeoDatabase程序集中定义。许多类型的实现包含在各自数据源的程序集里。 部署提示:此类库中有些对象的使用要求Geodatabase Update extension for ArcGIS Engine Runtime.
10.GISClient
包含远程GIS服务的对象。这些服务可由ArcIMS或是ArcGIS Server提供.
11.ArcWeb
提供ArcWeb服务连接.
12.DataSourcesFile
包含GeoDatabase API支持的矢量数据的workspace factories以及workspace。
13.DataSourcesGDB
包含GeoDatabase支持的矢量数据和栅格数据格式的workspace factories以及workspace。
14.DataSourcesOleDB
为基于OLEDB的数据源提供workspace.
15.DataSourcesRaster
包含文件栅格数据的workspace factories以及workspace。
16.DataSourcesNetCDF
包含用于读取netCDF文件的对象,以及在ArcGis中创建栅格、要素及表。
17.GeoDatabaseDistributed
包含支持分布式GeoDatabase perform、 checkout / checkin的对象.
18.GeoDatabaseExtensions
包含创建、管理和使用地形数据集(terrain datasets)以及地籍数据(cadastral fabrics)的对象.
注意:在9.2版本中,地籍相关对象还没有完全实现,因此我们建议开发者在Cadastral Analyst extension发布前不要使用它们。
19.Carto
包含显示数据的对象。对应地图图层的PageLayout和Map对象都在此类库中,渲染所有支持的数据类型。这个程序集也包括
MxdServer和MapServer对象,被server用于在客户服务器模式(client server environment)中显示地图数据.
20.NetworkAnalysis
支持实体网络(utility networks)的创建和分析.
21.Location
包含与位置数据工作相关的对象。这既可能是路径事件(route events),也可能是地理编码(geocoding locations).
22.GeoAnalyst
包含核心的空间分析运算,被用于SpatialAnalyst和3DAnalyst extensions.
部署提示:要求3D or Spatial extension for ArcGIS Engine runtime.
23.Animation
包含在Map, Scene and Globe中使用动画(Animation)的对象. 在ArcGIS 9.2中,包括ArcGIS Desktop,animation functionality在ArcMap, ArcScene, and ArcGlobe中都可以使用.然而,当使用ArcGIS Engine时, animation functionality对于Map control是无效的.它只能在Scene和Globe controls中使用, 这些是由3D Analyst extension支持的.
24.Maplex
包含通过使用Maplex Extension来标注要素的对象.其它的Maplex对象能在Carto程序集中找到.
部署提示:需要Maplex extension for ArcGIS Engine Runtime.
25.Geoprocessing
实现空间处理框架(Geoprocessing framework)来补充空间处理工具(Geoprocessing tools)的基础设置. 这些工具是否有效取决于你的licenses范围.参见individual tools for specific license information.
部署提示:有些geoprocessing tools和functionality要求extension license.参见documentation for each tool for specifics.
26.NetworkAnalyst
提供网络数据集(network datasets)工作的对象.这些对象允许你在你的程序中运行网络分析(network analysis).
部署提示:需要Network Analyst extension for ArcGIS Engine Runtime.
27.Schematic
实现图表扩展项(Schematics extension)的无用户界面功能性(non user-interface functionality).它掌握ArcGIS Schematics extension的核心对象, 被用于管理图表数据及加工(schematic data and processes).Schematics extension支持ArcGis中图表数据(schematic data)的分析、显示和操作.
部署提示:需要Schematic extension for ArcGIS Engine Runtime.
28.SpatialAnalyst
包含在栅格数据和矢量数据上运行空间分析(spatial analyst)的对象.
部署提示:需要Spatial extension for ArcGIS Engine Runtime.
30.3DAnalyst
包含数据的三维分析(3D analysis)对像,以及三维数据(3D data)显示.
部署提示:需要3D extension for ArcGIS Engine Runtime.
31.GlobeCore
包含地球数据(globe data)分析的对象,以及支持地球数据(globe data)的显示.在此程序集中有个控件(control)开发者可以使用。
部署提示:需要3D extension for ArcGIS Engine Runtime.
32.Controls
包含程序开发的控件(controls),包括相应的命令(commands)和工具(tools).
部署提示:使用GlobeControl或SceneControl的程序需要3D extension for ArcGIS Engine Runtime.
33.TrackingAnalyst
对ArcMap实现追踪分析扩展的无用户界面功能性(non-user interface functionality of the Tracking Analyst extension)to ArcMap.Tracking Analyst extension在ArcGis中支持时间数据(temporal data)的显示、分析和操作.
部署提示:需要Tracking extension for ArcGIS Engine Runtime

一个WorkspaceFactory是一个workspace的分配者,并允许一个客户连接到一个由一系列连接属性指定的workspace中。一个workspace代表一个数据库(database)或者一个包含一个或多个数据集(dataset)的数据源(datasource)。数据集(dataset)的例子包括表格(table)、要素类(feature class)和关系类(relationship class)。一个workspaceFactory是一个可联合创建的(cocreatable)、singleton(单独)的对象。一个workspacefactory维护当前程序引用的活动工作(workspace)连接的一个池(pool)。连接属性通过使用一个属性设置对象(propertyset object)来说明,并且可以存储到一个连接文件.一个workspaceFactory也支持浏览和管理文件系统工作(workspace)的方法,以及管理远程数据库工作(workspace)的连接文件的方法。
Remarks
A WorkspaceFactory is a dispenser of workspaces and allows a client to connect to a workspace specified by a set of connection properties. A workspace represents a database or a datasource that contains one or more datasets. Examples of datasets include tables, feature classes and relationship classes. A WorkspaceFactory is a cocreatable, singleton object. A WorkspaceFactory maintains a pool of currently connected, active workspaces that are being referenced by the application. Connection properties are specified using a PropertySet object and can be saved to a connection file. A WorkspaceFactory also supports methods that can be used to browse and manage file system workspaces, and methods to manage connection files for remote database workspaces.

类库的 app.config

【中文标题】类库的 app.config【英文标题】:app.config for a class library 【发布时间】:2011-08-06 04:59:20 【问题描述】:

我看不到 VS2008 向导为类库生成的 app.config 文件。在我的研究中,我发现在一个应用程序中只有一个 app.config 存在。

手动将 app.config 添加到类库中是不是一件坏事,或者是否有任何其他方法可以满足类库中 app.config 的目的?

我需要在 app.config 文件中存储 log4net 配置信息。

【问题讨论】:

你可以从你的库中读取你的可执行项目配置文件。 【参考方案1】:

您通常应该app.config 文件添加到类库项目中;如果您没有痛苦的弯曲和扭曲,它就不会被使用。它根本不会伤害库项目 - 它根本不会做任何事情。

相反,您配置正在使用您的库的应用程序;所以所需的配置信息会去那里。每个可能使用您的库的应用程序都可能有不同的要求,因此这实际上也是合乎逻辑的。

【讨论】:

对你有好处。不过,我没有回答你的问题。您显然有某种本土配置系统,不适用于此处提出问题的人。 我有一个 Selenium WebDriver 类库,我从 NUnit 为我的所有测试用例运行它。我宁愿不必担心在 NUnit 中设置配置。我怎样才能弯曲和扭转来完成这项工作? :-) 想通了...如果使用 NUnit,请将您的 app.config 文件命名为与 *.nunit 项目文件名相同的名称。例如,如果您将项目命名为“ClassLibraryA.nunit”,则将您的类库配置文件命名为“ClassLibraryA.config”。它们还需要驻留在同一文件夹/目录中。 NUnit 实际上使用它作为主要配置文件 .... 添加对 System.Configuration 的引用(在 .NET 选项卡中)...并使用此代码: string settingValue = ConfigurationManager.AppSettings["settingName"];跨度> 在进行集成测试时,您建议如何设置?对我来说,在带有连接字符串的测试库中有一个 app.config 似乎是合乎逻辑的。 如果由于您不拥有应用程序而无法配置应用程序怎么办。【参考方案2】:

我不知道为什么还没有给出这个答案:

同一个库的不同调用者通常会使用不同的配置。这意味着配置必须驻留在可执行应用程序中,而不是在类库中。

您可以在类库项目中创建一个 app.config。它将包含您在库中创建的项目的默认配置。例如,如果您在类库中创建实体框架模型,它将包含连接字符串。

但是,调用库的可执行应用程序不会使用这些设置。相反,可以将这些设置从 library.dll.config 文件复制到调用者的 app.config 或 web.config 中,以便可以将它们更改为特定于调用者以及调用者所在的环境部署。

从第一天开始,.NET 就是这样。

【讨论】:

但是如果我需要从类库中调用 webserice 功能该怎么办? VS 创建了一个默认的 app.config 但我的应用程序在尝试调用 webservice 函数时崩溃了 - 它找不到配置条目... 您必须将放置在类库app.config中的元素复制到类库调用者的app.config或web.config中。这允许调用者控制配置。例如,调用者现在可以更改您的类库调用的服务的 URL,而您的类库甚至不会知道更改。 @John Saunders:“可能需要”是完全正确的词。因此,可能存在配置设置仅因服务器而异的情况(例如连接字符串),让 dll 拥有自己的配置比为每个使用 dll 的程序集复制很多次更方便。在我看来,Microsofts/.NET 的首选用法并不是一个圣杯。这实际上取决于部署场景中最方便的方式。无需告诉托德,他的意见与您或微软的意见一样重要。 我对这个解决方案非常感兴趣 - 这对我来说听起来很理想。库将携带默认设置是有道理的,而应用程序将能够覆盖它们。您是否会详细说明如何将设置从库的 app.config 传播到正在执行的程序集的 app.config,或者将我引导至相关资源? @user1531508 作为不得不接管不想遵循 Microsoft/.Net“首选用法”(又名最佳实践)的“特殊”代码的人,我会说不。与替代方案相比,遵循最佳实践是圣杯。不,托德的意见不如微软的重要。【参考方案3】:

乔恩,很多意见都没有正确回答你的问题。

我会给出我的意见,然后告诉你如何按照你的要求去做。

我看不出程序集没有自己的配置文件的原因。为什么第一级原子性(这是一个真实的词?)在应用程序级别?为什么不在解决方案级别?这是一个武断的、最佳猜测的决定,因此是一个意见。如果您要编写一个日志库并希望为其包含一个配置文件,该配置文件将在全局范围内使用,您为什么不能挂钩到内置的设置功能?我们都做到了……试图为其他开发人员提供“强大”的功能。如何?通过做出固有地转化为限制的假设。这正是 MS 对设置框架所做的事情,因此您必须稍微“愚弄一下”。

要直接回答您的问题,只需手动添加配置文件 (xml) 并将其命名为与您的库匹配并包含“config”扩展名。示例:

MyDomain.Mylibrary.dll.Config

接下来,使用 ConfigurationManager 加载文件并访问设置:

string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath);
string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;

请注意,这完全支持 machine.config 层次结构,即使您已明确选择了应用配置文件。换句话说,如果设置不存在,它将解析得更高。设置也会覆盖 machine.config 条目。

【讨论】:

-1:您的意见本身并不重要。事实很重要。 .NET 从第一天开始创建,以便库的调用者确定库中项目的配置。这是唯一对配置有意义的事情,因为库的不同调用者可能需要不同的配置。 @JohnSaunders “库的不同调用者可能需要不同的配置。”确切地说,它们“可能”需要不同的配置,并且您的逻辑在配置确实依赖于调用者的所有情况下都非常有意义。但是有几种情况,配置在类库内部使用,配置完全一样,不管调用者是什么。如果您有 10 个应用程序使用一个库,那么将完全相同的配置复制并粘贴到 10 个配置文件中会更糟。 @ToddBeaulieu:我认为你想要的词是“原子性”。 在插件架构中,如果所有插件都有自己的配置文件,这确实是有意义的。 @RMuesi Noone 说它永远不会改变,只是它不依赖于库的调用者。配置可能会根据您是在调试库还是在生产版本进行更改。它可以根据您正在构建的环境等而改变。【参考方案4】:

事实上,您正在实现的类库正在从应用程序内部的 app.config 中检索信息,因此,在 .net 上实现类库配置的最正确方法在 VS 中是在应用程序中准备 app.config 来配置它所使用的所有内容,例如库配置。

我用 log4net 做了一些工作,我发现准备应用程序的人总是在 main app.config 中有一个 log4net 配置部分。

希望这些信息对您有用。

见,并发布有关您找到的解决方案的 cmets。

编辑:

在下一个链接中,您有一个 app.config,其中包含 log4net 部分:

http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx

【讨论】:

+1 完全正确; app.config 是从最终运行的实际程序加载的......而不是单个类库。坦率地说,有多少人不知道这个非常基本的事实,这有点令人困惑。 也许人们来自 Java 语言,你有一个 log4java.properties 和一个单独的应用程序属性文件。【参考方案5】:

如果您想使用 log4Net 配置项目日志记录,同时使用类库,则实际上不需要任何配置文件。您可以在一个类中配置您的 log4net 记录器,并将该类用作库。

因为 log4net 提供了配置它的所有选项。

请在下面找到代码。

public static void SetLogger(string pathName, string pattern)
        
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = pattern;
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = pathName;
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            MemoryAppender memory = new MemoryAppender();
            memory.ActivateOptions();
            hierarchy.Root.AddAppender(memory);

            hierarchy.Root.Level = log4net.Core.Level.Info;
            hierarchy.Configured = true;
      

现在您可以直接调用具有所需路径和模式的 SetLogger 来在 Global.asax 应用程序启动函数中设置记录器,而不是调用 XmlConfigurator.Configure(new FileInfo("app.config"))。

并使用以下代码记录错误。

        public static void getLog(string className, string message)
        
            log4net.ILog iLOG = LogManager.GetLogger(className);
            iLOG.Error(message);    // Info, Fatal, Warn, Debug
        

通过使用以下代码,您无需在应用程序 web.config 或库的 app.config 中编写单行代码。

【讨论】:

我觉得这是最好的答案......而不是讨论是否应该允许库配置文件......这个答案回答了OP使用Log4net的问题 尽管问题以 log4net 为例,但实际问题通常是关于配置的。我想说关于 log4net 的答案实际上是无关紧要的。【参考方案6】:

实际上,在极少数情况下,您可以将 app.config 存储在类库中(通过手动添加)并由 OpenExeConfiguration 解析。

 var fileMap =
    new ExeConfigurationFileMap ExeConfigFilename = 
    @"C:\..somePath..\someName.config";
 System.Configuration.Configuration config =
    ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
    ConfigurationUserLevel.None);

你真的应该估计这个的真正需要。对于抽象数据,它不是最好的解决方案,但“配置部分”可能非常有用!!

例如,我们通过使用基于 Channel Factory T 的 Unity Container 和 Injection Factory 来解耦组织我们的 N 层 WCF 架构,没有任何元数据。我们添加了带有 [Service Contract] 接口和通用应用程序的 externall ClassLibrary dll。配置以便从客户端部分读取端点,并在一处轻松添加/更改它们。

【讨论】:

【参考方案7】:

如果您使用跟踪器/记录器,您确实想将 App.config 添加到您的 tests 类库中。 否则,当您通过 TestDriven.Net 等测试运行程序运行测试时,不会记录任何内容。

例如,我在我的程序中使用TraceSource,但运行测试不会记录任何内容,除非我也将带有跟踪/日志配置的 App.config 文件添加到测试类库.

否则,将 App.config 添加到类库不会做任何事情。

【讨论】:

【参考方案8】:

对于非手动创建 app.config 的答案是 Visual Studio 项目属性/设置选项卡。

当您添加设置并保存时,您的 app.config 将自动创建。 此时会在 yourclasslibrary.Properties 命名空间中生成一堆代码,其中包含与您的设置对应的属性。设置本身将放在 app.config 的 applicationSettings 设置中。

 <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="ClassLibrary.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
</configSections>
<applicationSettings>
    <ClassLibrary.Properties.Settings>
        <setting name="Setting1" serializeAs="String">
            <value>3</value>
        </setting>
    </BookOneGenerator.Properties.Settings>
</applicationSettings>

如果您添加了一个名为 Setting1 = 3 的应用程序范围设置,则将创建一个名为 Setting1 的属性。 这些属性正在成为二进制文件的编译部分,并用 DefaultSettingValueAttribute 进行修饰,该属性设置为您在开发时指定的值。

     [ApplicationScopedSetting]
    [DebuggerNonUserCode]
    [DefaultSettingValue("3")]
    public string Setting1
    
        get
        
            return (string)this["Setting1"];
        
    

因此,在您的类库代码中,如果运行时配置文件中不存在相应的设置,您将使用这些属性,它将回退到使用默认值。这样应用程序就不会因为缺少设置条目而崩溃,当您第一次不知道这些东西如何工作时,这会非常令人困惑。 现在,您问自己如何在部署的库中指定我们自己的新值并避免使用默认设置值?

当我们正确配置可执行文件的 app.config 时,就会发生这种情况。两步。 1. 我们知道我们将为该类库设置一个设置部分,并且 2. 稍作修改,我们将类库的配置文件粘贴到可执行配置中。 (有一种方法可以将类库配置文件保留在外部,然后从可执行文件的配置中引用它。

因此,您可以为类库创建一个 app.config,但如果您没有将它与父应用程序正确集成,它就毫无用处。 看看我之前写的:link

【讨论】:

【参考方案9】:

将类库项目添加到解决方案时,不会自动添加 app.config 文件。

据我所知,没有关于手动执行此操作的反指示。我认为这是一种常见的用法。

关于log4Net的配置,你不必把配置放到app.config中,你可以在你的项目中有一个专用的conf文件,同时也可以有一个app.config文件。

此链接http://logging.apache.org/log4net/release/manual/configuration.html 将为您提供有关两种方式的示例(app.config 和独立 log4net conf 文件中的部分)

【讨论】:

在库项目中添加app.config 并没有什么坏处,不。但两者都不会被使用。 @AndrewBarber 它将用于测试项目。见***.com/a/31389495【参考方案10】:

我建议使用 Properties.Settings 在类库中存储 ConnectionStrings 等值。例如,当您尝试添加表适配器时,所有连接字符串都会根据 Visual Studio 的建议存储在其中。 enter image description here

然后可以通过在 clas 库中的每个位置使用此代码来访问它们

var cs=  Properties.Settings.Default.[<name of defined setting>];

【讨论】:

以上是关于ArcObject类库的AO参考类库的主要内容,如果未能解决你的问题,请参考以下文章

如何将第三方类库编译自己的动态库文件中

对Web开发中前端框架与前端类库的一些思考

如何在arduino中制作另一个类库的实例变量

包括来自类库的服务引用

python类库的查找

软件框架和类库的区别