Перегрузка метода в Excel COM Interop - PullRequest
0 голосов
/ 18 августа 2011

У меня много проблем с перегрузкой методов здесь, и я понятия не имею, почему каждый раз вызывается только один метод, независимо от количества параметров, которые я передаю.Ниже приведен пример кода.

[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 вместо базового метода.Похоже, весь класс просто застревает в первом методе и не будет продолжаться.

Ответы [ 2 ]

1 голос
/ 18 августа 2011

COM Interop не поддерживает перегрузку: см. Раздел «Перегрузка» в этой статье MSDN .

Экспортер библиотеки типов переименует перегруженные элементы, добавив префикс (например, _2).

0 голосов
/ 18 августа 2011

Excelfriend, вы не можете полиморфизировать функция листа.Например, функция листа, называемая GETSALESFORWEEK, может иметь только одну точку входа.Если вы предоставите две, скажем, GETSALESFORWEEK (int WeekNumber) и GETSALESFORWEEK (строка 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

* 1009Я думаю, это отвечает на мои вопросы.К сожалению, нет перегрузки метода для пользовательских функций Excel: (

Решение:

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

открытый класс myClass {// конструктор 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;}**/

//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();
    }

}

...