2012-01-19 24 views
7

Tôi có một số mã mà dựa vào phương pháp không được inlined:Có .Net 4 inline MarshalByRefObject phương pháp?

internal class MyClass : BaseClass 
{ 
    // should not be inlined 
    public void DoSomething(int id) 
    { 
     base.Execute(id); 
    } 
} 

public abstract class BaseClass : MarshallByRefObject 
{ 
    [MethodImpl(MethodImplOptions.NoInlining)] 
    protected void Execute(params object[] args) 
    { 
     // does a stack walk to find signature of calling method 
    } 
} 

Tất nhiên điều này không chỉ có tác dụng nếu phương pháp DoSomething không inlined. Đây là lý do tại sao lớp cơ sở xuất phát từ MarshallByRefObject, ngăn chặn nội tuyến phương pháp công khai.

Nó đã hoạt động cho đến bây giờ, nhưng tôi có một stacktrace từ một máy chủ .Net 4 cho thấy rằng stackwalk đến người gọi của DoSomething.

Có phải .Net 4 là nội tuyến thông minh hơn và phát hiện MyClass là nội bộ và không có cơ hội được thay thế bằng proxy?

+0

Không thể hoạt động tại đây. Chỉ có một cuộc gọi từ bên ngoài lớp học có thể phải được ủy quyền. Khi jitter được yêu cầu tạo mã cho chính lớp đó thì nó * biết * rằng một cá thể cục bộ của kiểu cần nó. Vì vậy, nội tuyến được cho phép. Các quy tắc nội tuyến thay đổi cho .NET 4 là những gì thực sự byte bạn. –

+0

Thực ra, phương thức DoSomething được gọi từ một lớp khác. Đó là lý do tại sao tôi nghĩ rằng nó không nên được gạch chân ... – thinkbeforecoding

Trả lời

0

Người nhận xét ở đây gợi ý rằng bạn cũng cần chỉ định NoOptimisation để đạt được những gì bạn muốn.

http://connect.microsoft.com/VisualStudio/feedback/details/162364/methodimpl-methodimploptions-noinlining-doesnt-work-correctly-on-x64

+0

Hàm thiếu trên ngăn xếp là DoSomething. Phương thức Execute không được gạch chân. Nhưng tôi nên thêm nooptimisation anyway trên Execute để chắc chắn nó sẽ không bao giờ inline nó. – thinkbeforecoding

Các vấn đề liên quan