2010-11-29 2 views
1

C# 개체의 전체 클래스 정의를 파일/데이터 저장소에 저장할 수있는 방법이 있습니까?C# 클래스 정의 저장

은 이미이 작업을 수행 할 [직렬화] 태그와 를 ISerializable 인터페이스를 사용하지만,이 두 런타임에서 어셈블리에있는 객체 정의에 의존하고 있습니다.

1) 사용자는, 를 객체에게 MyClass에 내 소프트웨어를 만들고이 예제의 목적으로

를 저장합니다

내가 찾고 다음 시나리오에 대한 해결책이다 이 예

전체 defini 수 : MyClass에 시스템에서 다른 클래스에 의존하지 않는 독립적 인 객체 인 기 :

public class MyClass 
{ 
    public int MyProperty { get; set; } 
    public void DoSomething() { /* do something, like Console.Write(""); */ } 
} 

2) 우리는 MyClass에

3) 사용자는 1 단계에서 저장된 MyClass에을로드하고 해봐요를 호출하는 시스템에서을 제거하는 패치를 릴리스() - 패치가 시스템에서 클래스를 제거하기 전과 완전히 동일한 기능을 수행합니다.


반사/트릭이 발생하지 않으면 어떤 방법 으로든 해결할 수 있습니까?

+0

인터페이스를 정의하지 않으시겠습니까? –

+1

이것은 매우 고쳐졌습니다. –

+0

윌, 동의합니다. 소규모 소프트웨어 회사가 제품을 "업그레이드"할 때 종종 "기존 제품은 더 이상 작동하지 않을 것"이라고 경고합니다. 나는 내 케이크를 먹고 그것을 먹으려 고 노력하고있다. "당신의 오래된 재료는 여전히 확실히 작동 할 것이고, 우리는 그것을지지하지 않을 것"이라고 말하면서. – Michael

답변

3

아니요, 유형 정의가 방출되지 않으면 작동하지 않습니다. 당신이하려는 것은 실제로 코드를 저장하는 것입니다 (그렇지 않다면, 어떻게 DoSomething이 작동할까요?). 이것은 컴파일러가 당신을 위해하는 일입니다. 일반 직렬화는 여기에서 결코 작동하지 않습니다.

상태뿐만 아니라 동작을 저장해야하는 경우 이전 버전의 코드를 유지하거나 유형 정의를로드 가능한 어셈블리로 유지하기 위해 일련의 반사 방출 트릭을 사용하거나 동적 프로그래밍 트릭을 사용해야합니다. 데이터를 실행 가능한 코드로 취급하십시오.

이전에 버전 관리를 수행했을 때 일반적으로 객체에 사용자 정의 직렬화 논리 및 "버전"속성이 있습니다.이 유형을 사용하여 이동하고 이름을 바꾼 형식을 만들 수 있습니다. 을 Archive.SomeClassV3으로 말하십시오. 이 경우 Version Tolerant Serialization을 사용할 수 있지만, 필자는 ISerializable을 구현하고 이것이 필요한 경우 직렬화 프록시를 사용하는 것을 선호합니다. (사실,이 문제를 완전히 피하는 것이 더 좋습니다!)

0

음, 이러한 직렬화 가능한 클래스를 모두 자체 DLL에 보관하고 응용 프로그램과 함께 DLL을 패키지화하고 런타임에 DLL을로드 할 수 있습니다. 이렇게하면 최신 버전의 응용 프로그램에서 클래스를 제거하더라도로드 된 DLL이 여전히 작동합니다.

이것은 무서운 접근 방법처럼 보입니다. 이제는 클라이언트가 더 이상 소스 제어 저장소에없는 고대 코드를 실행하게됩니다.그걸 어떻게 디버깅 할 예정입니까?

+0

나는 동의한다, 그것은 무서운 생각이다. 네가 원한다면 나는 "상자 밖에서 생각하기"위해 노력하고있다. – Michael

+0

여전히 소스 코드 재 작성에 문제가 있습니다. 소스 제어는 영원합니다.

0

당신은 클래스 속성 직렬화가 아니라 프로세스 직렬화 (또는 방법 -, 중요하지 않음)에 대해 이야기합니다. 그러나 속성 직렬화와 달리 필요시 실행되는 MSIL 코드가 있어야합니다. 그래서 어떻게 든 빈 코드로 변환 한 다음 Assembly.Load로 실행해야합니다. 나는 이것이 이것을하는 쉬운 방법이 아니라고 생각한다. 그래서 이것이 가능하다면 MyClass의 구현을 별도의 dll 또는 리플렉션을 통한 추가 컴파일 및 실행을위한 문자열 (C# 언어)로 저장하십시오.