COM -> .NET – no se puede acceder al método sobrecargado

Estoy intentando acceder a una biblioteca .Net (The Image Resizer) desde COM (jscript).

He probado tanto IDispatch como la generación de interfaz de clase, así como [ClassInterface (ClassInterfaceType.AutoDual)] en la clase en cuestión.

Hay un método con 3 sobrecargas:

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

Vocación

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

Los dos siguientes generan “Número incorrecto de argumentos o asignación de propiedad no válida” (error de tiempo de ejecución de JScript)

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

No puedo encontrar ninguna razón por la que las sobrecargas no funcionen a través de la interoperabilidad, especialmente cuando el recuento de arg es diferente. ¿Me estoy perdiendo de algo?

Actualización: Aquí está el código completo de las definiciones del método. La segunda sobrecarga es inaccesible. No son solo estos métodos: en todos los métodos sobrecargados, parece que solo puedo acceder a la primera sobrecarga. ¿Es este un error de diseño / error COM sin documentar?

  ///  /// 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. ///  public class ImageBuilder : AbstractImageProcessor, IQuerystringPlugin { ///  /// 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 &bgcolor to specify a background color /// if you use this method with a non-transparent format such as Jpeg. ///  /// May be an instance of string (a physical path), VirtualFile, IVirtualBitmapFile, HttpPostedFile, Bitmap, Image, or Stream. /// Resizing and processing command to apply to the. public virtual Bitmap Build(object source, ResizeSettings settings) { BitmapHolder bh = new BitmapHolder(); Build(source, bh, settings); return bh.bitmap; } ///  /// Resizes and processes the specified source image and stores the encoded result in the specified destination. ///  /// 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 /// May be a physical path (string), or a Stream instance. Does not have to be seekable. /// Resizing and processing command to apply to the. public virtual void Build(object source, object dest, ResizeSettings settings) { ResizeSettings s = new ResizeSettings(settings); 

Es cierto que COM no “hace” la sobrecarga de métodos.

PERO. vea http://msdn.microsoft.com/en-us/library/ms182197(v=vs.80).aspx .

Esta es una página de documentos en FxCop, una herramienta de análisis estático. Pero hay un poco de información allí, que es útil para los desarrolladores de COM:

Cuando los métodos sobrecargados se exponen a los clientes COM, solo la sobrecarga del primer método conserva su nombre. Las sobrecargas subsiguientes se renombran únicamente agregando al nombre un carácter de subrayado ‘_’ y un entero que corresponde al orden de statement de la sobrecarga.

y también ver
Sobrecargas en interoperabilidad COM (CCW): los nombres de IDispatch incluyen sufijo (_2, _3, etc.)

Entonces, a través de la capa COM, puede llamar a sus métodos originales con

 Build_2("file", "file", s); Build_3("file", "file", settings); 

La sobrecarga no funciona para la capa de interoperabilidad a COM. Sin embargo, podría usar parámetros opcionales y ocultar todos los demás métodos de la capa 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) 
    Intereting Posts