2014-01-10 54 views
0

我寫過一個類庫。爲了執行我在我的類庫中編寫的方法,我創建了一個控制檯應用程序。在我的控制檯應用程序中,我添加了作爲參考編寫的類庫。然後我將適當的using語句添加到我的控制檯應用程序。我目前從這個庫中獲得的方法是無法訪問的。爲什麼?爲什麼我的類庫方法不出現在我引用的控制檯應用程序中?

這是我的類庫,有一個基本的方法。它是在.NET Framework 3.5中創建的。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 
using ESRI.ArcGIS.Geodatabase; 
using ESRI.ArcGIS.esriSystem; 
using ESRI.ArcGIS.DataSourcesGDB; 
using ESRI.ArcGIS.Geometry; 

namespace RelateTablesValidation 
{ 

    [Guid("e1058544-0d84-49be-a406-b4e65707f95b")] 
    [ClassInterface(ClassInterfaceType.None)] 
    [ProgId("RelateTablesValidation.Validate")] 
    [ComVisible(true)] 



    public class Validate : ESRI.ArcGIS.Geodatabase.IClassExtension, ESRI.ArcGIS.Geodatabase.IObjectClassExtension, ESRI.ArcGIS.Geodatabase.IRelatedObjectClassEvents2 

    { 

    public void ChangeClassExtension(IObjectClass objectClass, String extensionUID, IPropertySet extensionProperties) 
      { 
       ISchemaLock schemaLock = (ISchemaLock)objectClass; 

       try 
       { 
        // Attempt to get an exclusive schema lock. 
        schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock); 

        // Cast the object class to the IClassSchemaEdit2 interface. 
        IClassSchemaEdit2 classSchemaEdit = (IClassSchemaEdit2)objectClass; 

        if (!String.IsNullOrEmpty(extensionUID)) 
        { 
         // Create a unique identifier (UID) object and change the extension. 
         UID extUID = new UIDClass(); 
         extUID.Value = extensionUID; 
         classSchemaEdit.AlterClassExtensionCLSID(extUID, extensionProperties); 
        } 
        else 
        { 
         // Clear the class extension. 
         classSchemaEdit.AlterClassExtensionCLSID(null, null); 
        } 
       } 
       catch (COMException comExc) 
       { 
        throw new Exception("Could not change class extension.", comExc); 
       } 
       finally 
       { 
        schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock); 
       } 
      } 
} 

這是我的控制檯應用程序。 RelateTablesValidation是類庫。也在.NET Framework 3.5中創建的

using System; 
using System.Collections.Generic; 
using System.Text; 
using RelateTablesValidation; 
using Esri.ArcGIS.Geodatabase; 
using ESRI.ArcGIS.DatasourcesGDB; 

    namespace ApplyClassExtension 
    { 
    class Program 
     { 


      [STAThread()] 
      static void Main(string[] args) 
      { 
       //system sees objects from this namespace OK 
       IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactory(); 


       //now when i try to call my method, it doesn't even show up in Intellisense 
       ChangeClassExtension(method params would go here); 

      } 
     } 
    } 
+2

哎呀我希望我能看到你的代碼,以便我可以幫你...但你沒有提供任何。 –

+0

庫是否使用不兼容的.NET框架?例如,你創建了一個Silverlight庫,還是一個針對更高版本的.NET(比如4.5),而你的控制檯應用程序的目標是3.5? –

+0

@SimonWhitehead我添加了代碼 – Conor

回答

1

你不能做你想做的事。

C#中的所有方法都在對象內部。您必須使該方法static,並調用它像這樣:

Validate.ChangeClassExtension(...); 

還是不要讓靜態和實例的Validate一個實例:

var val = new Validate(); 
val.ChangeClassExtension(...); 
+0

我覺得這很簡單。你能否詳細說明爲什麼你想用另一種方式? – Conor

+0

靜態方法通常用於與類型相關的方法(在您的情況下爲「驗證」),但不需要該類的實例的狀態。你的班級似乎沒有任何狀態(字段,屬性等)。因此,您可以將類本身設爲'static',並將方法'static'(如果將類設爲static,則方法_必須爲「static」)。 –

相關問題