3

동적으로 컴파일 된 ASP.NET 웹 사이트 프로젝트에서 App_Code 폴더의 어셈블리를 명시 적으로 명명 할 수 있습니까?동적으로 컴파일 된 ASP.NET 웹 사이트의 App_Code 폴더에 명시 적 어셈블리 이름을 제공 하시겠습니까?

예를 들어, 일정한 환경에서 I는 neizakfo 다를 수있는 부분은 어디 Temporary ASP.NET Files\ 폴더 생성 어셈블리 이름 부분적 App_Code.neizakfo.dll 같이 무작위되는 ASP.NET 웹 사이트를 실행할 때. App_Code_Web1.dll과 같은 어셈블리 이름을 명시 적으로 제공 할 수 있습니까? 비즈니스 요구 사항으로

대한 설명

는 웹 사이트 구축/미리 컴파일 할 수 없습니다. 따라서 위의 설명대로 Temporary ASP.NET Files 폴더와 동적으로 컴파일 된 어셈블리의 컨텍스트에서 솔루션을 찾고 있습니다.


배경 :
나는 구성에 저장된 어셈블리 자격을 갖춘 이름을 사용하여 웹 사이트의 App_Code 폴더에 클래스에서 동적 유형의 인스턴스를 수행 할 수있는 방법을 찾고있는 동안이 질문을 통해 온,하지만 인스턴스화 웹 페이지에서 어셈블리 경계를 넘어서게됩니다. 웹 페이지와 app_code 코드는 기본적으로 두 개의 다른 어셈블리로 컴파일되므로 현재 실행중인 어셈블리 (웹 페이지) 나 mscorlib에서 Type 이름을 검색하는 Type.GetType (..) 메서드의 기본 동작은 App_Code 어셈블리에서 Type을 선택하는 데 충분합니다. 무작위 화되었으므로 app_code 어셈블리 이름은 어셈블리가 정규화 된 문자열에 포함되지 않습니다.

이 문제를 없애기 위해 클래스 라이브러리에 데이터 형식을 넣을 수 있습니다 (미리 정의 된/정확한 이름이 있기 때문에). 그러나이 형식을 만들지 않고이 작업을 수행하는 방법을 알고 싶습니다. 클래스 라이브러리 프로젝트.

+1

일종의. http://msdn.microsoft.com/ko-kr/library/bb398860.aspx#PreCompilingToFixedNameAssemblies를 참조하십시오. 나는이 동작이 훨씬 더 잘 정의되어 있기 때문에 웹 애플리케이션을 선호한다. 당신이하고자하는 것은 웹 애플리케이션 프로젝트에서 사소한 것입니다. – dash

답변

4

웹 사이트 프로젝트에서 정렬 할 수 있습니다.

프로젝트를 컴파일 할 때 MSDN article on using the -fixednames flag이 있습니다.

이렇게하면 각 페이지 (default.aspx.dll)에 대한 어셈블리가 효과적으로 생성됩니다. 그러나 이것은로드 할 때 찾고있는 컨트롤이나 페이지의 이름을 알아야하기 때문에 약간 유용합니다. 따라서 형식과 이름이 일관성을 유지해야합니다. 그러나 app_code 클래스의 이름을 존중해야합니다.

당신이 할 수있는 다른 한 가지는 app_code의 모든 코드를 자체 어셈블리로 이동 한 다음 프로젝트 참조로 추가하는 것입니다. 이는 또한이 문제를 단순화합니다.

마지막으로 bin 디렉토리에있는 모든 dll을 열거하고 찾고있는 유형에 대해 각각을 검색 할 수 있습니다. 이것은 상당히 비싸기 때문에 한 번만 수행하고 그 결과를 어딘가에 캐시하면 해당 유형을 볼 때마다 계속 수행하지 않습니다. 이것은 아마도 최악의 해결책 일 것입니다.

이것은 WebApplication 프로젝트에서 할 일이지만, 웹 사이트 프로젝트에 익숙하지 않다고 생각합니까?

편집 : 의견에 대한 업데이트로; 게시 웹 도구를 사용하면 app_code의 모든 코드가 App_Code.dll이라는 dll 디렉토리의 bin 디렉토리에 있습니다. 고정 된 이름 지정을 사용하더라도이 동작은 변경되지 않습니다 (모든 고정 된 이름 지정 효과는 dll의 이름 지정에 사용됩니다). 각 페이지, usercontrol).이 파일에 ILSpy을 사용하면 수업을 볼 수 있습니다. 그래서 저는 어셈블리의 이름을 알고 있습니다. 그리고 그것은 위치에 있습니다. 최소한의 노력으로 그것의 타입을 얻을 수 있어야합니다. 나는 왜 내가 너에게 다른 행동을하고 있는지 궁금해. 로, 그것은 "사람"을 쓴

Type myType = Assembly.LoadFrom(Server.MapPath("~/bin/App_Code.dll")).GetType("Person", true); 
    Response.Write(myType.ToString()); 

:

내가 ID와 이름으로 "사람"이라는 간단한 클래스를 만든 다음 사이트를 컴파일을 App_Code에 넣어, 그리고 다음 코드를 실행 예상했다.

또한 편집

페니는 상품! 그때 할 경우

object myObject= Activator.CreateInstance("App_Code.dll", "Person"); 

을 그리고 사람에게 myObject에 캐스팅하려고, 나는 다음과 같은 메시지가 :

The type 'Person' exists in both 'App_Code.dll' and 'App_Code.jydjsaaa.dll '

그래서 그것의 시간을 우회 할 수 있습니다.

은 Global.asax에에서의 Application_OnStart에, 다음을 수행하십시오 내 테스트 기본 페이지에서

Application["App_Code_Assembly"] = Assembly.GetAssembly(typeof(Person)); 

을 그때했다 : 나에게 무작위로 이름을 App_Code했다

Assembly app_Code = Application["App_Code_Assembly"] as Assembly; 
    Response.Write(app_Code.FullName); 

그것은 실제로 임시 ASP.Net 파일에서 실행 중입니다.

이것은 내가 웹 사이트 프로젝트를 싫어하는 이유입니다 .-)

+0

배경 정보에 나와있는 것처럼 별개의 어셈블리가 가능하지만 내가없이 할 수 있는지 알아 내려고합니다. 모든 DLL이 웹 사이트의 bin 폴더에있는 것은 아니므로 ASP.NET Temp 파일을 열거하는 것을 주저하고 있지만 나중에 사용하기 위해 정보를 캐싱하는 것이 최적화 된 방법입니다. 첫 번째 제안에서 웹 페이지가 어셈블리 이름을 알고있는 경우에도 동일한 상황으로 인해 문자열 이름으로 app_code 클래스 (웹 페이지가 아님)를 동적으로로드 할 수 없습니다. 고정 된 이름에 대해 명확한 설명을 제공 할 수 있습니까? 제안, app_code에 대한 영향을 이해하지 못할 수도 있습니다. –

+0

저는 완성을 위해 제 응답을 작성했습니다. 코드를 별도의 어셈블리에 넣는 것이이 인스턴스의 올바른 대답이지만, 여러분이하려는 것에 매우 관심이 있습니다 (좋은 질문입니다!). 웹 사이트 프로젝트를 사용한 지 꽤 오래되었지만 (여러 이유로 싫어합니다.) 초기 프로젝트 중 하나를 살펴보고 거기에서이 라인을 따라 뭔가를 시도해 보았습니다. – dash

+0

@JohnK 방금 시도한 실험으로 답변을 업데이트했습니다. – dash