Как удалить Excel UDF программно

У меня есть старый плагин для Excel (написанный на VBA), теперь я переписываю старый плагин, используя.NET, ExcelDNA, NetOffice. В старом дополнении есть UDF, скажем, OldUDF, в новом дополнении есть NewUDF, два UDF делают то же самое и принимают одинаковые параметры. но у них разные имена функций. По устаревшей причине у некоторых клиентов есть старое дополнение, у некоторых - новое. У некоторых клиентов есть оба. Когда у них установлены оба надстройки Excel, я хочу установить флажок для пересылки oldUDF на newUDF в новом надстройке. Когда флажок установлен, oldUDF пересылается как newUDF. Если флажок не установлен, oldUDF не будет пересылаться. Я определяю oldUDF и newUDF в новом дополнении, но не знаю, как удалить определение старого старого, когда флажок снят. Спасибо

Редактировать:

Вот то, что я пытался, но это не работает.

#if FORWARD
        public static object OldUDF([ExcelArgument(AllowReference = true, Name = "Symbol",
            Description = "is a futures symbol as defined in *** Database.")]string symbol,
            [ExcelArgument(AllowReference = true, Name = "Column",
                Description = "is a column associated with a symbol")]string column,
            [ExcelArgument(AllowReference = true, Name="Date",
                Description = "is the date for which you want the value")]object onDate,
                object fillOpt, object frequency)
        {
            return NewUDF(symbol, column, onDate, fillOpt, frequency);
        }
#endif 

В AutoOpen() я буду читать прямое значение (true или false) из файла, если forward равно true,

        var forward = Helper.ReadForwardOldUDFSettingFromAFile();
        if(forward)
        {
             #define FORWARD
        }

но я получаю ошибку компиляции

Редактировать снова: мне удалось успешно зарегистрироваться, я поместил объявление OldUDF в отдельную DLL, скажем, oldUDF.dll создать еще один oldUDF.xll, oldUDF.dna.

В AutoOpen я проверю, является ли значение пересылки (из файла) истинным, я сделаю Excel.Application.RegisterXLL("oldUDF.xll"); Это отлично работает.

Тем не менее, в случае если значение forward равно false, я не могу найти способ отменить регистрацию или удалить XLL в C#?

Изменить: я нашел http://msdn.microsoft.com/en-us/library/office/bb687866.aspx, но не уверен, как использовать его в C#

Спасибо

1 ответ

Решение

Спасибо, Говерт. Он ответил на вопрос из другой группы. Оно работает! http://exceldna.codeplex.com/discussions/436393

private static void UnregisterFunction(string name) 
{ 
    // get the path to the XLL 
    var xllName = XlCall.Excel(XlCall.xlGetName); 

    // get the registered ID for this function and unregister 
    var regId = XlCall.Excel(XlCall.xlfEvaluate, name); 
    XlCall.Excel(XlCall.xlfSetName, name); 
    XlCall.Excel(XlCall.xlfUnregister, regId); 

    // reregister the function as hidden and then unregister (clears the function wizard) 
    var reregId = XlCall.Excel(XlCall.xlfRegister, xllName, "xlAutoRemove", 
    "I", name, ExcelMissing.Value, 2); 
    XlCall.Excel(XlCall.xlfSetName, name); 
    XlCall.Excel(XlCall.xlfUnregister, reregId); 
} 
Другие вопросы по тегам