IL, вараги и ExcelDNA

Контекст: Windows 7, ExcelDNA 0.30, .NET 4.0

Я все еще пытаюсь заставить работать params/ParamArray в Excel через ExcelDNA. Используя varags, я избегаю всего, что связано с System.ParamArrayAttribute, и иду по пути с System.ArgIterator.

Печальный факт заключается в том, что следующее компилируется, но все еще не работает. Я продолжаю получать ошибки значений. Что-то не так, но я недостаточно знаю этот ассемблер (пока), чтобы понять это. Любые идеи, кто-нибудь??

.assembly extern mscorlib { } 
.assembly Test {} 
.module test.dll
.namespace VTest {
    .class public Test { 
        // Compute sum of undefined number of arguments 
        .method public static vararg int64 IntSum(/* all arguments optional */) 
        { 
            .locals init(valuetype [mscorlib]System.ArgIterator Args, 
                        unsigned int64 Sum, 
                        int32 NumArgs) 
            ldc.i8 0 
            stloc Sum    


            ldloca Args 
            arglist // Create argument list structure  
            // Initialize ArgIterator with this structure: 
            call instance void [mscorlib]System.ArgIterator::.ctor( 
               value class [mscorlib]System.RuntimeArgumentHandle) 

            // Get the optional argument count: 
            ldloca Args 
            call instance int32 [mscorlib]System.ArgIterator::GetRemainingCount() 
            stloc NumArgs 

            // Main cycle: 
          LOOP: 
            ldloc NumArgs 
            brfalse RETURN // if(NumArgs == 0) goto RETURN; 

            // Get next argument: 
            ldloca Args 
            call instance typedref [mscorlib]System.ArgIterator::GetNextArg() 

            // Interpret it as unsigned int64: 
            refanyval [mscorlib]System.UInt64 
            ldind.u8 

            // Add it to Sum: 
            ldloc Sum 
            add 
            stloc Sum // Sum += *((int64*)&next_arg) 

            // Decrease NumArgs and go for next argument: 
            ldloc NumArgs 
            ldc.i4.m1 
            add 
            stloc NumArgs 
            br LOOP 

          RETURN: 
            ldloc Sum 
            ret 
        } 

    }
}

person bugmagnet    schedule 18.12.2012    source источник
comment
«Я продолжаю получать ошибки значений». Какие ошибки? Где вы их берете? Кроме того, почему вы вообще пытаетесь использовать varagrs и IL?   -  person svick    schedule 18.12.2012
comment
Я попытался вызвать ваш метод из С# (используя __arglist), и он работал нормально. Так что проблема где-то в другом месте, возможно, в ExcelDNA или в том, как вы его используете.   -  person svick    schedule 18.12.2012
comment
@svick: Спасибо хотя бы за доказательство того, что это работает. К сожалению, как говорит Говерт в ответе, ExcelDNA не поддерживает params/ParamArray.   -  person bugmagnet    schedule 18.12.2012


Ответы (1)


Excel-DNA (и API Excel C) в настоящее время не поддерживает (версия 0.30) необязательные параметры params. Дополнительные сведения и возможные обходные пути см. в этом обсуждении: http://exceldna.codeplex.com/discussions/406719

person Govert    schedule 18.12.2012
comment
Проект Excel-DNA CustomRegistration (github.com/Excel-DNA/CustomRegistration) теперь поддерживается для массивов параметров params. - person Govert; 19.05.2014