Debe arrojar excepciones. Las excepciones están mapeadas a HRESULTS por el Framework, y HRESULT es la forma estándar de devolver errores a los clientes COM, así que este es el camino a seguir.
Cada tipo de excepción tiene una propiedad HResult. Cuando el código administrado llamado desde un Cliente COM arroja una excepción, el tiempo de ejecución pasa el HResult al cliente COM. Si desea códigos HRESULT específicos de la aplicación, puede crear sus propios tipos de excepción personalizados y establecer la propiedad Exception.HResult.
Un punto a tener en cuenta es que la información de la pila de llamadas se perderá cuando se genere una excepción a un cliente COM. Por lo tanto, puede ser una buena idea registrar excepciones antes de propagar al cliente COM.
Una técnica que a veces uso es la siguiente: implementar explícitamente una interfaz ComVisible para clientes COM que registra y vuelve a lanzar excepciones. Los clientes COM utilizan la interfaz ComVisible que registra las excepciones antes de propagarlas. Los clientes .NET utilizan la clase concreta y se espera que hagan sus propios arreglos para el manejo de excepciones. Es un poco largo para escribir, pero puede ser útil cuando posteriormente se soluciona.
Otra ventaja de este enfoque es que puede tener una API adaptada a las restricciones de COM para clientes COM y una API más estándar para clientes .NET estándar. Por ejemplo, los clientes COM están restringidos a pasar matrices por referencia, mientras que el paso por referencia se desaconseja para los clientes .NET.
Ejemplo:
[
ComVisible(true),
GuidAttribute("..."),
Description("...")
]
public interface IMyComVisibleClass
{
// Text from the Description attribute will be exported to the COM type library.
[Description("...")]
MyResult MyMethod(...);
[Description("...")]
MyOtherResult MyArrayMethod([In] ref int[] ids,...);
}
...
[
ComVisible(true),
GuidAttribute("..."),
ProgId("..."),
ClassInterface(ClassInterfaceType.None),
Description("...")
]
public class MyComVisibleClass : IMyComVisibleClass
{
public MyResult MyMethod(...)
{
... implementation without exception handling ...
}
public MyOtherResult MyArrayMethod(int[] ids,...)
{
... input parameter does not use ref keyword for .NET clients ...
... implementation without exception handling ...
}
MyResult IMyComVisibleClass.MyMethod(...)
{
// intended for COM clients only
try
{
return this.MyMethod(...);
}
catch(Exception ex)
{
... log exception ...
throw; // Optionally wrap in a custom exception type
}
}
MyOtherResult IMyComVisibleClass.MyArrayMethod(ref int[] ids, ...)
{
// intended for COM clients only
try
{
// Array is passed without ref keyword
return this.MyArrayMethod(ids, ...);
}
catch(Exception ex)
{
... log exception ...
throw; // Optionally wrap in a custom exception type
}
}
}
excepciones se asignan a HRESULTS, así que este es el mejor enfoque. Ver mi respuesta a continuación. – Joe