2015-09-11 3 views
3

У меня есть COMVisible COM класс, написанный на C#. Я хочу вызвать его из другого кода C# кода, используя COM, и передать значение по умолчанию для параметра. Я могу вызвать множество других методов без аргументов по умолчанию.Передача параметра по умолчанию метода COM

Это лучшее, что я могу придумать. Первые две строки работают для всех моих других методов.

Type mytype = Type.GetTypeFromProgID("MyType"); 
dynamic myinstance = Activator.CreateInstance(mytype); 
object missingValue = System.Reflection.Missing.Value; 
myinstance.generatecsvdocument("mystring", ref missingValue); 

Мой метод выглядит следующим образом:

public void generatecsvdocument(string mystring, string rowseperator = "\n") 

Когда я запускаю его я получаю сообщение об ошибке:

The best overloaded method match for 'generatecsvdocument(string, string)' has some invalid arguments

+0

Is '(string, string)' overload _really_ существует? Сообщение об ошибке вполне понятно. –

+0

Ну да, он существует, но я передаю System.Reflection.Missing.Value как второй аргумент, который не является строкой. –

+1

Я не думаю, что COM имеет методы по умолчанию. C#, но не все функции C# отображаются в COM. – MSalters

ответ

2
object missingValue = System.Reflection.Missing.Value; 

Это не может работать здесь. Он действителен только для COM-метода, который принимает параметр VARIANT в качестве аргумента. Похож на объект или динамический в C#. Механизм аргументов по умолчанию, отличный от того, что поддерживает C#, определяет значение по умолчанию. В C# это определитель, который определяет его, компилятор C# использует метаданные, чтобы знать это значение по умолчанию.

Missing.Value превращается в вариант типа vtError со значением DISP_E_PARAMNOTFOUND во время выполнения. Сигнал метода COM для использования значения по умолчанию. На самом деле это не используется, как правило, только на COM-серверах, поддерживающих языки сценариев. Office Automation - наиболее распространенный пример, возможно, что вдохновило вас на это.

Но нет, ваш аргумент строка, а не вариант. Невозможно обнаружить значение по умолчанию, когда вы используете позднюю привязку, подразумевается, что вы ничего не знаете о значении по умолчанию, хранящемся в метаданных. В противном случае причина, по которой существует механизм vtError, имеет ту же проблему, что и языки сценариев. Единственный реальный способ добиться успеха - переписать метод и проверить аргумент null, заменив «\ n», если это так.

+0

спасибо, на самом деле невозможно изменить метод, поскольку я не могу изменить другой бит кода, который его вызывает. Я просто назову его из C#, чтобы проверить свой код C# COM, поэтому я могу изменить использование VB.net, который, я думаю, будет работать лучше. –

+2

Hmya, распространенная ошибка. Вы на самом деле ничего не тестируете, CLR не так легко обмануть. В процессе выполнения можно увидеть, что это на самом деле сборка .NET и не будет использовать COM-взаимодействие. Вы также можете проверить его, добавив ссылку на сборку, это значение по умолчанию будет работать :) –

+0

Спасибо, что я пробовал это, но использовал интерфейс как тип переменной. Если я переключусь на фактический класс, а не на интерфейс, он может «видеть» значения по умолчанию. –

Смежные вопросы