동적으로 컴파일된 어셈블리에 대한 명시적 어셈블리 이름 제공 ASP.NET 웹 사이트의 앱_코드 폴더?

StackOverflow https://stackoverflow.com/questions/9520231

문제

동적으로 컴파일된 ASP.NET 웹 사이트 프로젝트,앱_코드 폴더에 대한 어셈블리의 이름을 명시 적으로 지정할 수 있습니까?

예를 들어,일반적인 상황에서 내가 실행할 때 ASP.NET 웹 사이트에 생성 된 어셈블리 이름 Temporary ASP.NET Files\ 폴더는 부분적으로 다음과 같이 무작위로 지정됩니다 App_Code.neizakfo.dll 어디 네이자크포 다를 수 있는 부분입니다.다음과 같이 어셈블리에 대한 이름을 명시 적으로 제공 할 수 있습니까 App_Code_Web1.dll?

설명

비즈니스 요구 사항에 따라 웹 사이트를 미리 컴파일/배포 할 수 없습니다.따라서 나는 맥락에서 해결책을 찾고 있습니다 Temporary ASP.NET Files 위에서 언급 한대로 폴더 및 동적으로 컴파일 된 어셈블리.


배경:
나는 구성에 저장되었지만 웹 페이지에서 인스턴스화 된 어셈블리 정규화 된 이름을 사용하여 웹 사이트의 앱_코드 폴더에있는 클래스에 대해 동적 유형 인스턴스화를 수행하는 방법을 찾는 동안이 질문을 발견했습니다.웹 페이지와 앱_코드 코드는 기본적으로 두 개의 다른 어셈블리로 컴파일되기 때문에 형식입니다.게타이프(..)메소드의 기본 동작으로 현재 실행 중인 어셈블리(웹 페이지)에서 또는 엠스코리브에서 타입 이름을 검색하는 것은 앱_코드 어셈블리에서 어떤 타입도 선택하기에 충분하지 않습니다.임의적으로,앱_코드 어셈블리 이름은 어셈블리 정규화 된 문자열에 포함 할 수 없습니다.

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

도움이 되었습니까?

해결책

당신은 일종의 웹 사이트 프로젝트에서이 작업을 수행 할 수 있습니다.

거기에 이 플래그를 사용하는 방법은 다음과 같습니다. 프로젝트를 컴파일 할 때.

이렇게하면 각 페이지 기본값에 대한 어셈블리가 효과적으로 생성됩니다.아스프스델그러나 로드할 때 찾고 있는 컨트롤이나 페이지의 이름을 알아야 하므로 유형과 이름이 일치하는지 확인해야 합니다.그것은,그러나,응용 프로그램_코드에서 클래스의 이름을 존중해야한다 그래서 이것은 당신을 위해 작동 할 수 있습니다.

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

마지막으로,빈 디렉터리에 있는 모든 디렉터리를 열거 하 고 당신이 찾고 있는 형식에 대 한 각 하나를 검색할 수 있습니다.이 상당히 비싼,그것을 한 번,그리고 캐시 결과 어딘가에 그래서 당신은 당신이 그 유형을 볼 때마다 그 일을 계속 하지 않습니다.이것은 아마도 최악의 해결책 일 것입니다.

이 웹 응용 프로그램 프로젝트에서 할 사소한,하지만 난 당신이 웹 사이트 하나와 함께 붙어 가정?

편집: 댓글에 대한 업데이트로;내가 웹 게시 도구를 사용하는 경우,다음 응용 프로그램_코드의 모든 코드는 응용 프로그램_코드라는 빈 디렉토리에 간다.-이 동작은 고정 이름 지정을 사용하는 경우에도 변경되지 않습니다(모든 고정 이름 지정은 각 페이지에 대한 이름 지정에 영향을 미침,사용자 제어).내가 사용하는 경우 일스피 이 파일에,나는 거기에 내 클래스를 볼 수 있습니다.그래서 나는 어셈블리의 이름을 알고 있으며,그 위치는 최소한의 노력으로 그 안에 있는 유형을 얻을 수 있어야 합니다.나는 왜 당신에게 다른 행동을보고 있는지 궁금합니다!

나는 아이디와 이름을 가진"사람"이라는 간단한 클래스를 만들고 그것을 앱_코드에 넣고 사이트를 컴파일 한 다음 다음 코드를 실행했습니다:

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

예상대로"사람"을 썼습니다.

추가 편집

페니 방울!내가 할 경우:

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

그리고 내 객체를 사람에게 캐스팅하려고하면 다음과 같은 메시지가 나타납니다:

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

그래서 그것은 악독 할 때입니다.

글로벌에서응용 프로그램 시작 시 다음을 수행합니다:

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

내 테스트 기본 페이지에서 다음을 수행했습니다:

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

어떤 나에게 임시로 실제로 실행중인 무작위로 명명 된 응용 프로그램_코드를 준 ASP.Net 파일들

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top