source

GetManifestResourceNames를 호출할 때 리소스 이름이 존재하는 동안 GetManifestResourceStream이 null을 반환하는 이유는 무엇입니까?

ittop 2023. 7. 1. 09:59
반응형

GetManifestResourceNames를 호출할 때 리소스 이름이 존재하는 동안 GetManifestResourceStream이 null을 반환하는 이유는 무엇입니까?

저는 웹 애플리케이션 프로젝트가 있습니다.DLL을 생성하여 다른 프로젝트로 가져왔습니다.구현했습니다.VirtualPathProvider.

는 이 웹사이트인 http://support.microsoft.com/kb/910441/en-us?spid=8940&sid=global, 을 팔로우했고 다른 사이트 마스터를 추가하기 전까지는 모든 것이 작동합니다.

  1. 추가했습니다.site_export.master빌드 작업을 Embedded Resource로 변경했습니다.
  2. 새 사이트 마스터를 사용하기 위해 페이지를 변경했습니다.
  3. GetManifestResourceStream()돌아온다null적재할 때site_export.master.
  4. 부를게요GetManifestResourceNames()확인하기 위해site_export.masterDLL에 존재하며 존재합니다.리스트에 있습니다.모든 이름 공간이 일치합니다.여기에 이름 공간을 기재하지 않았습니다.

왜 안 돼요?GetManifestResourceStream()내 새 것을 로드합니다.site_export.master로딩됩니다.site.master잘 돼가고 있습니다.DLL에서 다른 파일을 볼 수 있기 때문에 DLL이 로드된 것으로 알고 있습니다.

다음 문제를 기억하십시오...

1단계. 임베디드 리소스로 설정된 빌드 작업 참조

C#의 GetManifestResourceStream Gotcha

2단계. 사용namespace.resourcenameGetManifestResourceStream()에서 null을 반환하는 항목을 참조하십시오.

실제로 이 메서드는 다른 어셈블리의 개인 리소스에 액세스하고 호출자에게 다음이 없으면 null을 반환합니다.ReflectionPermission와 함께ReflectionPermissionFlag.MemberAccess깃발

사이드 힌트.올바른 어셈블리에 올바른 이름을 사용하고 있는지 확인하려면: 대상 어셈블리에서 사용 가능한 모든 리소스를 덤프하고 평가합니다.

string[] names = assembly.GetManifestResourceNames();

(저의 경우 다른 어셈블리의 네임스페이스를 잘못 사용했습니다.)

저는 그것을 작동시키기 위해 이것을 했습니다.

1단계: 리소스(내 경우 CRDF.xsl)를 선택하고 > 속성을 마우스 오른쪽 버튼으로 클릭합니다.빌드 작업을 "포함된 리소스"로 설정하고 논리적 이름을 선택한 이름(예: CRDFXSL)으로 설정합니다.

2단계: 소스 코드를 다음과 같이 변경합니다.

Assembly _assembly;
  _assembly = Assembly.GetExecutingAssembly();         
  xslStream = _assembly.GetManifestResourceStream("CRDFXSL");
  _xmlReader = XmlReader.Create(xslStream);

그래서 모든 것이 순조로웠습니다.

힌트 및 주의:프로젝트 파일에서 "어셈블리 이름"과 "기본 네임스페이스"가 일치하지 않으면 GetManifestResourceStream도 null을 반환합니다.GetManifestResourceNames는 어셈블리 이름을 여전히 반환하지만 로드 중에는 매니페스트가 작동하지 않습니다.

사용해 보십시오.

Dim ctx As Windows.ApplicationModel.Resources.Core.ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
ctx.Languages = {Globalization.CultureInfo.CurrentUICulture.Name}
Dim rmap As Windows.ApplicationModel.Resources.Core.ResourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap
Dim res = rmap.GetValue("Assets/sample.png", ctx)
Dim resFile = Await res.GetValueAsFileAsync

Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap모든 리소스를 나열합니다.

언급URL : https://stackoverflow.com/questions/10726857/why-does-getmanifestresourcestream-returns-null-while-the-resource-name-exists-w

반응형