2011-05-06 4 views
3

나는 다음 FSI에 DLL을 참조하는 dll을FSI를 통해 모듈을 열 때 강제로로드 할 수 있습니까?

namespace MyNs 
module SomeModule = 
    do printfn "module loading" 
    let x = 23 

에 다음 모듈을 컴파일하고 즉시 인쇄되지 않습니다 명령 open MyNs.SomeModule "모듈로드"를 실행합니다. 모든 상위 레벨 let 및 do 바인딩이 실행되도록하는 x에 액세스 할 때만 인쇄됩니다 (.NET 환경에서 알고있는 정상적인 동작). 모듈의 속성을 통해 어쩌면 FSI에서 모듈을 열 때 모듈이 즉시로드되어야 함을 나타낼 수 있습니까?

+0

'open MyNS.SomeModule' 대신'SomeModule = MyNS.SomeModule' 모듈을 사용해 보셨습니까? 그게 다른지 궁금해. FWIW, VS에서 '대화 형으로 보내기'를 사용하여 예상대로 작동합니다. – Daniel

+0

@Daniel - 그냥 시도해 보았습니다. 'Module SomeModule = MyNS.SomeModule'은 그것을하지 않습니다. –

답변

2

모듈을 열면 런타임에 아무 것도 실행되지 않습니다. 열려있는 명령문 아래의 규정되지 않은 액세스를 위해 열려있는 네임 스페이스의 모든 기호를 범위에 넣습니다.

language spec의 12.5 절은 읽고 싶은 것입니다. 모듈의 정적 초기화가 실행될 때의 자세한 내용입니다.

이 초기화가 자동으로 실행되는 유일한 시간은 내가 아는 한 exe의 마지막 모듈입니다.

e.e. 나는 당신이 원하는 것을 성취 할 수있는 직접적인 방법이 없다고 생각합니다.

당신이 모듈에 반사 액세스 할 수있는 경우 :

ModuleType.TypeInitializer.Invoke(null, null) 

정적 초기화를 호출합니다.

+1

이렇게하면 do 블록을 두 번 실행합니다! 어떤 생각을 어떻게 피할 수 있습니까? –

+0

그것으로 디버그하고 양쪽 모두가 호출되는 곳에서 보았을 것입니다. 나는 그게 가능하다고 생각하지는 않았지만 많이 들여다 보지 않았다. –

0

당신은 당신이 X를 참조 할 때 그러나 이것은 단지 모듈 로딩 메시지를 출력 할 것이다 모듈

[<AutoOpen>] 
module SomeModule = 
    do printfn "module loading" 
    let x = 23 

에에 AutoOpen 속성을 추가 할 수 있습니다.

+0

감사합니다. @Nick R,하지만 명시 적으로 열 었는지 여부에 관계없이 모듈을 "자동로드"할 방법을 찾고 있습니다. 또는 AutoOpen을 통해) *이 예제에서'x'를 참조하여로드를 강제하지 않아도됩니다. –

0

문제점에 대한 해결책을 찾았는지 확실하지 않지만 제 경우에는 웹 사이트가 시작될 때 상담원을 시작하고 실제로 언급 한 것처럼 두 번 시작했습니다.

내가 한 것은 모듈 내에 let start() = 메서드를 설정하고 Site 타입의 static do xxx.start()을 사용하는 메서드를 호출하는 것입니다.

Kurt linked 언어 사양을 읽음으로써 발견되었습니다.

관련 문제