온갖 삽질을 다 하다가 알아낸 해결책~
소스 :
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=99693

문제의 발단.

global/static변수를 생성/초기화 하는 코드가 프로그램 시작과 동시에 불려야 하는데 CLR프로젝트에선 그 코드가 안불린다.
프로그램 빌드는 되나 실행을 하면 프로그램의 entry point로 진입하기 전에 _crtvalidheap 어쩌고 저쩌고 하는 assert에 부딪힌다.

해결법.

1. 포인터로 만들고 CLR어플리케이션에서 동적으로 생성한다.. MyClass::Init()같은 함수를 호출하여... -_- (근데 static pointer는 생성을 안해도 괜찮은거야?)
 장점 : 간단하다.
 단점 : 전역 오브젝트를 모두 클라이언트에서 생성하는건 x삽질임이 분명하다.


2. 함수 내부로 static을 옮긴다.
ex)
class X()
{
 static int a;
 int GetA() { return a; }
}



class X()
{
 int GetA() { static a; return a;}
}
이렇게 하면 실제 생성하는 시점이 처음으로 GetA가 호출된 시점이 되기 때문인지 문제가 발생하지 않는다.

 장점 : 역시 간단하다. 그리고 완벽한 실행이 된다.
 단점 : 모든곳에 적용할 수 없다.. 싱글턴용 static 정도에나 쓸만할듯?


3. 링커 옵션에서 entry point를 지우고 서브시스템 설정(콘솔, 윈도우, etc) 역시 없앤다.
 장점 : 코드 수정이 필요 없는 완벽한 솔루션
 단점 : 무조건 콘솔창이 하나 백그라운드에 뜬다. 정말로 치명적인 단점 -_-


4. 링커 옵션에서 시작점을 ?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Z 로 바꾼다.
 장점 : 코드 수정이 필요 없는 완벽한 솔루션
 단점 : 이게 대체 왜 문제를 해결해 주는지 당최 이해를 못하겠... -_-;;;;



와 뭔가 있어보이는 포스팅을 드디어 했다~
....
오 이런 oTL

트랙백 주소 :: http://netcrawler.pe.kr/tt/trackback/37

댓글을 달아 주세요

  1. SieL 2007/05/06 18:54  댓글주소  수정/삭제  댓글쓰기

    .........무슨 뜻인지 알 수가 없다!

  2. madduck 2007/05/15 14:44  댓글주소  수정/삭제  댓글쓰기

    오웃 @.@