ArcSDE C API在.NET中的调用 在.NET中调用API函数C#: using System.Runtime.InteropServices;[DllImport("sde.dll")]//还有其他的属性可参考MSDNpublic static extern Int32 SE_connection_create(string server, string instance, string database, string username, string pwd, ref SE_ERROR error, out IntPtr pSdeConn); VB.NET: Imports System.Runtime.InteropServices<DllImport("sde.dll", SetLastError:=True, ThrowOnUnmappableChar:=True)> _Public Shared Function SE_connection_create()Function SE_connection_create(ByVal server As String, ByVal instance As String,ByVal database As String, ByVal username As String, ByVal password As String, ByRef error1 As SE_ERROR,ByRef connection As IntPtr) As Int32End Function 还可以使用Declar关键字来引用API函数,这里就不介绍了。 ArcSDE C API的声明方法 '--------------↓声明SE_ERROR结构体↓----------------- <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _ Public Structure SE_ERROR Public sde_error As Int32 Public ext_error As Int32 '<MarshalAs(UnmanagedType.ByValArray, SizeConst:=512)> _ Public err_msg1 As Char() '<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4096)> _ Public err_msg2 As Char() End Structure '--------------↑声明SE_ERROR结构体↑----------------- '-------------------调用SE_connection_create函数---------------------- '------------------连接SDE------------------------- '返回结果 'SE_SUCCESS 0 'SE_FAILURE -1 'SE_NO_ACCESS -15 'SE_SDE_NOT_STARTED -5 'SE_IOMGR_NOT_AVAILABLE -101 'SE_INVALID_DATABASE -162 'SE_INVALID_SERVER -100 'SE_INVALID_POINTER -65 'SE_INVALID_USER -9 'SE_LOGIN_NOT_ALLOWED -8 'SE_DBMS_DOES_NOT_SUPPORT -1008 'SE_NET_FAILURE -10 'SE_NET_TIMEOUT -11 'SE_SERVICE_NOT_FOUND -102 'SE_TASKS_EXCEEDED -7 <DllImport("sde.dll", SetLastError:=True,ThrowOnUnmappableChar:=True)> _ Public Shared Function SE_connection_create(ByVal server As String, ByVal instance As String, _ ByVal database As String, ByVal username As String, ByVal password As String, ByRef error1 As SE_ERROR, _ ByRef connection As IntPtr) As Int32 End Function '----------------------------调用SE_connection_free函数------------------------- '----------------------------释放SDE连接---------------------- <DllImport("sde.dll", SetLastError:=True, ThrowOnUnmappableChar:=True)> _ Public Shared Sub SE_connection_free(ByVal Byrefconnection As IntPtr) End Sub 在程序中的调用 Imports QHProject.SDE_C_APIImports System.Runtime.InteropServices Partial Class MapServicePage Inherits System.Web.UI.Page Private Shared conn As IntPtr = Nothing Private error1 As QHProject.SDE_C_API.SDE_C_API_Operation.SE_ERROR = Nothing Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load End Sub Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Int32 = SDE_C_API_Operation.SE_connection_create("CL", "5151", "sde", "sde", "clbeyond", error1, conn) Button1.Text = i.ToString() End Sub Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click SDE_C_API_Operation.SE_connection_free(conn) End SubEnd Class 连接成功后Button的Text属性会显示为0,表示连接成功,在任务管理器中就会发现出现了一个gsrvr.ext进程。断开连接后gsrvr.exe进程就会消失。当然前提是要在程序中将连接字段conn声明为shared类型(C#中的Static类型)。需要注意的是Instance不是"esri_sde",而是端口号,一般为5151。 2008年3月10日15:41:31