Сегодня чуть не убился об клавиатуру. Но решение проблемы таки нашел. Теперь хочу понять, что это было?
Есть COM+ приложение. В нем есть интерфейс и класс, его реализующий. Этот же класс является компонентом COM+. В интерфейсе есть метод, принимающий в качестве параметра массив Decimal. Код для наглядности:
public interface Interface4
{
void Test4(decimal[] ddd);
}
[ObjectPooling(true, 1, 100),
EventTrackingEnabledAttribute(true),
Guid("DD779496-07EC-424f-A26F-690DE436F320"),
ClassInterface(ClassInterfaceType.AutoDispatch),
Transaction(TransactionOption.Required)]
public class Class4 : ServicedComponent, Interface4
{
public void Test4(decimal[] ddd)
{
// Мега логика.
}
}
Теперь пытаемся вызвать этот метод из клиента:
Class4 c4 = new Class4();
decimal[] ddd = new decimal[] { 111M };
c4.Test4(ddd); // System.ArgumentException: Value does not fall within the expected range.
Убился я собственно перебирая варианты, при которых этот код заработает.
Работает он, если:
1. Убрать у класса реализацию интерфейса. Но этот вариант не подходил, так как в реальном классе на промышленной системе есть уже куча клиентов, использующих этот класс через интерфейс.
2. Изменить тип с decimal, на какой-либо другой, например, double. Но это тоже не айс, так как нужен именно decimal.
3. Передавать массив через ref. На этом варианте и остановился. Но вот вопрос почему именно так??? Что за шляпа? Что не так с типом decimal?
Забыл еще один вариант указать:
4. Если передавать не массив, а просто тип decimal, то есть "void Test4(decimal ddd);". Но этот вариант тоже не подходит, так как нужен был именно массив.
Здравствуйте, baranovda, Вы писали:
B> А атрибутом MarshalAs играться не пробовали?
Еще десять тысяч вариантов, и я бы сломал клавиатуру.
Если подскажете, что конкретно надо было указать в MarshalAs, буду благодарен. И хотелось бы еще объяснение получить, почему именно так.
Здравствуйте, Spiceman, Вы писали:
S>Еще десять тысяч вариантов, и я бы сломал клавиатуру. S>Если подскажете, что конкретно надо было указать в MarshalAs, буду благодарен. И хотелось бы еще объяснение получить, почему именно так.