COM ->. NET - не может получить доступ к перегруженному методу - PullRequest
1 голос
/ 17 мая 2011

Я пытаюсь получить доступ к библиотеке .Net (Image Resizer) из COM (jscript).

Я попробовал как IDispatch, так и генерацию интерфейса класса, а также [ClassInterface (ClassInterfaceType.AutoDual)] для рассматриваемого класса.

Существует метод с 3 перегрузками:

Bitmap Build(object, ResizeSettings settings)
void Build(object source, object dest, string settings)
void Build(object source, object dest, ResizeSettings settings)

Вызов

Build("file",s); //works

Следующие оба кода генерируют «Неверное количество аргументов или неправильное присвоение свойства» (ошибка времени выполнения JScript)

Build("file","file", s) 
Build("file","file","settings

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

Обновление: Вот полный код определений методов.Вторая перегрузка недоступна.Это не только эти методы - в каждом перегруженном методе мне кажется, что я могу получить доступ только к первой перегрузке.Это недокументированная ошибка в COM / дизайне?

    /// <summary>
    /// Provides methods for generating resized images, and for reading and writing them to disk.
    /// Use ImageBuilder.Current to get the current instance (as configured in the application configuration), or use ImageBuilder.Current.Create() to control which extensions are used.
    /// </summary>
    public class ImageBuilder : AbstractImageProcessor, IQuerystringPlugin
    {


        /// <summary>
        /// Resizes and processes the specified source image and returns a bitmap of the result.
        /// This method assumes that transparency will be supported in the final output format, and therefore does not apply a matte color. Use &amp;bgcolor to specify a background color
        /// if you use this method with a non-transparent format such as Jpeg.
        /// </summary>
        /// <param name="source">May be an instance of string (a physical path), VirtualFile, IVirtualBitmapFile, HttpPostedFile, Bitmap, Image, or Stream.</param>
        /// <param name="settings">Resizing and processing command to apply to the.</param>
        public virtual Bitmap Build(object source, ResizeSettings settings) {
            BitmapHolder bh = new BitmapHolder();
            Build(source, bh, settings);
            return bh.bitmap;
        }

        /// <summary>
        /// Resizes and processes the specified source image and stores the encoded result in the specified destination. 
        /// </summary>
        /// <param name="source">May be an instance of string (a physical path or app-relative virtual path), VirtualFile, IVirtualBitmapFile, HttpPostedFile, Bitmap, Image, or Stream. app-relative virtual paths will use the VirtualPathProvider system</param>
        /// <param name="dest">May be a physical path (string), or a Stream instance. Does not have to be seekable.</param>
        /// <param name="settings">Resizing and processing command to apply to the.</param>
        public virtual void Build(object source, object dest, ResizeSettings settings) {
            ResizeSettings s = new ResizeSettings(settings);

Ответы [ 2 ]

4 голосов
/ 22 августа 2011

Правда, COM не "перегружает" метод.

НО.см http://msdn.microsoft.com/en-us/library/ms182197(v=vs.80).aspx.

Это страница документа на FxCop, инструменте статического анализа.Но есть немного информации, которая полезна для разработчиков COM:

Когда перегруженные методы открыты для COM-клиентов, только первая перегрузка метода сохраняет свое имя.Последующие перегрузки однозначно переименовываются путем добавления к имени символа подчеркивания '_' и целого числа, соответствующего порядку объявления перегрузки.

, а также см.
Перегрузки в COM-взаимодействии (CCW) - имена IDispatch включают суффикс (_2, _3 и т. Д.)

Итак, черезСлой COM, вы можете вызывать ваши оригинальные методы с помощью

Build_2("file", "file", s);
Build_3("file", "file", settings);
3 голосов
/ 18 мая 2011

Перегрузка не работает для уровня взаимодействия с COM. Однако вы можете использовать необязательные параметры и скрыть все остальные методы из слоя COM:

// COM won't see this.
[ComVisible(false)]
void Test(string a) 

// COM will see this and parameter b is not required
void Test(string a, [DefaultParameterValue(null)] string b)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...