2011-08-18 5 views
0

여기서 오버로드되는 메서드에 많은 문제가 발생하며 전달하는 매개 변수의 수에 관계없이 매번 한 메서드 만 호출되는 이유를 알 수 없습니다. 아래는 샘플 코드입니다.Excel에서 오버로드하는 방법 COM Interop

[ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)] 
public class myClass 
{ 
    //constructor 
    public myClass() {} 

    //base method 
    public string myfunction(string id, string pk) {return results;} 

    //overloading method 1 
    public string myfunction(string id, string pk, string param1) { return results;} 

    //overloading method 2 
    public string myfunction(string id, string pk, string param1, string param2) {return results;} 



    [ComRegisterFunctionAttribute] 
     public static void RegisterFunction(Type type) 
     { 

      Registry.ClassesRoot.CreateSubKey(
       GetSubKeyName(type, "Programmable")); 
      RegistryKey key = Registry.ClassesRoot.OpenSubKey(
       GetSubKeyName(type, "InprocServer32"), true); 
      key.SetValue("", 
       System.Environment.SystemDirectory + @"\mscoree.dll", 
       RegistryValueKind.String); 
     } 
     [ComUnregisterFunctionAttribute] 
     public static void UnregisterFunction(Type type) 
     { 

      Registry.ClassesRoot.DeleteSubKey(
       GetSubKeyName(type, "Programmable"), false); 
     } 
     private static string GetSubKeyName(Type type, 
      string subKeyName) 
     { 
      System.Text.StringBuilder s = 
       new System.Text.StringBuilder(); 
      s.Append(@"CLSID\{"); 
      s.Append(type.GUID.ToString().ToUpper()); 
      s.Append(@"}\"); 
      s.Append(subKeyName); 
      return s.ToString(); 
     } 

} 

Excel에서 테스트했을 때 기본 방법이 정상적으로 작동하여 예상 값을 얻을 수있었습니다. 그러나 메서드 오버로딩을 사용하여 나머지 두 함수를 시도하면 오류가 발생합니다. 그들은 단순히 어떤 이유로 전화를받지 않았습니다. 코드에서 뭔가 빠졌습니까? 누구든지 제발 도와 주실 래요? 매우 감사합니다.

편집 : 몇 가지 실험을 통해

, 단지 1 방법은 일반적으로 첫 번째 방법 인이 인식 할 수 있다는 것을 나에게 발생합니다. 따라서 기본 메서드와 오버로드 메서드 1 사이에서 순서를 바꿀 경우 오버로드 메서드 1이 기본 메서드 대신 호출됩니다. 전체 클래스가 첫 번째 메소드에서 멈추고 계속 진행되지 않는 것처럼 보입니다.

+0

wheres가 발신자 코드입니까? – Zenwalker

+0

나는이 = myfunction (1,20)' – woodykiddy

+0

을 사용하거나 선택적 매개 변수를 추가하는 것으로 Excel에서한다. 단지 '= myfunction (1,20, myparamvalue)'을 수행한다. – woodykiddy

답변

0

Excelfriend, 너 은 워크 시트 기능을으로 다형화할 수 없습니다. 예를 들어 GETSALESFORWEEK라고하는 워크 시트 함수는 엔트리 포인트 만 가질 수 있습니다. 두 개를 제공하는 경우 GETSALESFORWEEK (int WeekNumber) 및 GETSALESFORWEEK (string WeekName)이라고 말하면 Excel 2007에서는이 함수가 GETSALESFORWEEK 및 GETSALESFORWEEK_2로 표시됩니다.

출처 : http://blogs.msdn.com/b/gabhan_berry/archive/2008/04/07/writing-custom-excel-worksheet-functions-in-c_2d00_sharp.aspx

그럼 난 그게 내 질문에 대답 같아요.

[ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)] 

공공 MyClass 클래스 { // 생성자 공공 myClass가() {}

//base method 
/**public string myfunction(string id, string pk) {return results;}**/ 

//overloading method 1 
/**public string myfunction(string id, string pk, string param1) { return results;}**/ 

//just use 1 method, but make the last two arguments optional by setting default values 
public string myfunction(string id, string pk, string param1 = "", string param2 = "") {return results;} 



[ComRegisterFunctionAttribute] 
    public static void RegisterFunction(Type type) 
    { 

     Registry.ClassesRoot.CreateSubKey(
      GetSubKeyName(type, "Programmable")); 
     RegistryKey key = Registry.ClassesRoot.OpenSubKey(
      GetSubKeyName(type, "InprocServer32"), true); 
     key.SetValue("", 
      System.Environment.SystemDirectory + @"\mscoree.dll", 
      RegistryValueKind.String); 
    } 
    [ComUnregisterFunctionAttribute] 
    public static void UnregisterFunction(Type type) 
    { 

     Registry.ClassesRoot.DeleteSubKey(
      GetSubKeyName(type, "Programmable"), false); 
    } 
    private static string GetSubKeyName(Type type, 
     string subKeyName) 
    { 
     System.Text.StringBuilder s = 
      new System.Text.StringBuilder(); 
     s.Append(@"CLSID\{"); 
     s.Append(type.GUID.ToString().ToUpper()); 
     s.Append(@"}\"); 
     s.Append(subKeyName); 
     return s.ToString(); 
    } 

}

: 슬프게도, 어떤 방법은 사용자 정의 Excel 함수 :(

솔루션에 대한 과부하가 없습니다

1

COM Interop는 오버로드를 지원하지 않습니다.의 "오버로드"섹션을 참조하십시오. 210.

형식 라이브러리 내보내기는 접두사 (예 : _2)를 추가하여 오버로드 된 멤버의 이름을 바꿉니다.