using System; using System.Collections.Generic; using System.Text; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; namespace DesktopConsoleApplication1 { class Program { [STAThread()] static void Main(string[] args) { IWorkspace iws; iws = AccessWorkspaceFromPath(@"C:\GD\Test.mdb"); } public static IWorkspace AccessWorkspaceFromPath(String path) { //ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop); IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.ArcInfoWorkspaceFactoryClass(); // Get FeatureClass to be set as datasource IWorkspace workspace = workspaceFactory.OpenFromFile(path, 0); return workspace; } } }
Not only do you have to bind to a product runtime you also have to check out a license. This should occur before you use any ArcObjects. In your code you are declaring an IWorkspace instance before the call to Bind. You need to move the call to Bind and add the code to check out the license. Also, you are trying to open an Access personal geodatabase but your code is creating an instance of an ArcInfoWorkspaceFactory. You need to be using an AccessWorkspaceFactory. The workspace factory is a singleton object. You shouldn't be using New to create the instance. Instead, you should be using the Activator class.
using System; using System.Collections.Generic; using System.Text; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; namespace DesktopConsoleApplication1 { class Program { [STAThread()] static void Main(string[] args) { ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop); IWorkspace iws; iws = AccessWorkspaceFromPath(@"C:\GD\Test.mdb"); } public static IWorkspace AccessWorkspaceFromPath(String path) { Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.AccessWorkspaceFactory"); IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance (factoryType); IWorkspace workspace = workspaceFactory.OpenFromFile(path, 0); return workspace; } } }
You need to check out a license after the call to Bind and before using any ArcObjects.
using System; using ESRI.ArcGIS.Geodatabase; using System.IO; using System.Windows.Forms; using ESRI.ArcGIS.esriSystem; namespace DesktopConsoleApplication1 { class Program { [STAThread()] static void Main(string[] args) { ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop); IAoInitialize aoInit = new AoInitializeClass(); aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine); IWorkspace iws; iws = AccessWorkspaceFromPath("Test.mdb"); aoInit.Shutdown(); } public static IWorkspace AccessWorkspaceFromPath(String path) { if (File.Exists(path)){ Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.AccessWorkspaceFactory"); IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance (factoryType); IWorkspace workspace = workspaceFactory.OpenFromFile(path, 0); return workspace; } return null; } } }
You should be checking the result of the call to Initialize to make sure the license is checked out and exit the program if it is not. Also, you need to pass the full path to open the workspace and not just the file name.