2011-11-29 10 views
5

Các hệ lụy hoặc hậu quả không được nhận thức của việc ném một ngoại lệ bên trong của một đại biểu được sử dụng trong một cuộc gọi lại không được quản lý là gì? Đây là tình hình của tôi:Những ảnh hưởng của việc ném ngoại lệ trong đại biểu gọi lại không được quản lý

Switch C:

int return_callback_val(int (*callback)(void)) 
{ 
    return callback(); 
} 

Managed C#:

[DllImport("MyDll.dll")] 
static extern int return_callback_val(IntPtr callback); 

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
delegate int CallbackDelegate(); 

int Callback() 
{ 
    throw new Exception(); 
} 

void Main() 
{ 
    CallbackDelegate delegate = new CallbackDelegate(Callback); 
    IntPtr callback = Marshal.GetFunctionPointerForDelegate(delegate); 
    int returnedVal = return_callback_val(callback); 
} 
+0

Điều gì sẽ xảy ra khi bạn thử? –

Trả lời

7

Mã gốc sẽ ném bom vào ngoại lệ chưa được xử lý và chương trình chấm dứt.

Nếu bạn thực sự muốn xử lý ngoại lệ đó thì bạn cần phải sử dụng tùy chỉnh __try/__catch keywords trong mã gốc. Đó là khá vô dụng, tất cả các chi tiết của ngoại lệ quản lý bị mất. Đặc điểm phân biệt duy nhất là mã ngoại lệ, 0xe0434f4d. Vì bạn không thể biết chính xác điều gì đã xảy ra, bạn cũng không thể phục hồi trạng thái chương trình một cách đáng tin cậy. Tốt hơn là không bắt được nó. Hay tốt hơn là không vứt nó đi.

0

Tôi nghĩ rằng cách chính xác để nói với một đối tượng COM bạn có một ngoại lệ chỉ đơn giản là để trở HRESULT. E_FAIL.

Không thể kiểm tra ngay bây giờ, nhưng tôi nghĩ rằng nếu đối tượng COM đang trong quá trình khác, tất cả những gì bạn cần làm là hủy quá trình của bạn và đối tượng COM có thể không phản hồi, chờ mã của bạn quay lại từ cuộc gọi lại chức năng (kể từ khi quá trình của bạn đã chết).

+0

Đó không phải là đối tượng COM. –