컴파일러 경고(수준 1) CS1690

‘member’는 참조로 마샬링하는 클래스의 필드이므로 여기에 있는 멤버에 액세스하면 런타임 예외가 발생할 수 있습니다.

이 경고는 MarshalByRefObject로부터 파생되는 클래스의 멤버에 있는 메서드, 속성 또는 인덱서를 호출하려고 하고 멤버가 값 형식일 때 발생합니다. MarshalByRefObject에서 상속되는 개체는 일반적으로 애플리케이션 도메인 전체에서 참조로 마샬링됩니다. 애플리케이션 도메인에서 그러한 개체의 값 형식 멤버에 직접 액세스하려고 시도하는 코드가 있을 경우 런타임 InvalidOperationException이 발생합니다. 이 경고를 해결하려면 먼저 멤버를 지역 변수에 복사하고 해당 변수에서 메서드를 호출합니다.

다음 샘플에서는 CS1690 경고가 발생합니다.

// CS1690.cs  
using System;

class WarningCS1690 : MarshalByRefObject
{
    int i = 5;

    public static void Main()
    {
        AppDomain domain = AppDomain.CreateDomain("MyDomain");
        Type t = typeof(WarningCS1690);
        WarningCS1690 e = (WarningCS1690)domain.CreateInstanceAndUnwrap(t.Assembly.FullName,t.FullName);

        e.i.ToString(); // CS1690

        // OK  
        int i = e.i;
        i.ToString();
        e.i = i;
    }
}