현재 실행중인 DLL의 위치를 ​​얻는 방법은 무엇입니까?


94

작성중인 dll 실행의 일부로로드해야하는 구성 파일이 있습니다.

내가 가진 문제는 내가 dll 및 구성 파일을 넣은 위치가 앱이 실행될 때 "현재 위치"가 아니라는 것입니다.

예를 들어, 여기에 dll 및 xml 파일을 넣습니다.

D : \ Program Files \ Microsoft Team Foundation Server 2010 \ Application Tier \ Web Services \ bin \ Plugins

그러나 다음과 같이 (내 dll에있는) xml 파일을 참조하려고하면 :

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

. \ AggregatorItems.xml은 다음과 같이 변환됩니다.

C : \ windows \ system32 \ inetsrv \ AggregatorItems.xml

따라서 현재 실행중인 dll이 어디에 있는지 아는 방법을 찾아야합니다. 기본적으로 나는 이것을 찾고 있습니다.

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

답변:


140

당신이 찾고있는 System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

노트 :

.Location속성은 현재 실행중인 DLL 파일의 위치를 ​​반환합니다.

일부 조건에서 DLL은 실행 전에 섀도 복사되며 .Location속성은 복사본의 경로를 반환합니다. 원래 DLL의 경로를 원하는 경우 Assembly.GetExecutingAssembly().CodeBase대신 속성을 사용하십시오.

.CodeBasefile:\제거해야 할 수 있는 접두사 ( ) 가 포함되어 있습니다 .


8
아아! 반환C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano 2011 년

23
아! 하지만 Assembly.GetExecutingAssembly().CodeBase있습니다!
Vaccano

2
CodeBase가 저에게 file : \\ c : \ myassemblypath를주었습니다. 이것은 이상합니다
Matt

10
@ 매트 사용하는 새로운 열린 우리당 (. Assembly.GetExecutingAssembly () 코드베이스) .LocalPath 진짜 이름을 얻을
래리

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell

39

지적했듯이 성찰은 당신의 친구입니다. 그러나 올바른 방법을 사용해야합니다.

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

17

필자의 경우 (Outlook에 [파일로]로드 된 어셈블리 처리) :

typeof(OneOfMyTypes).Assembly.CodeBase

에서 CodeBase(아님 Location) 의 사용에 유의하십시오 Assembly. 다른 사람들은 어셈블리를 찾는 다른 방법을 지적했습니다.


5
System.Reflection.Assembly.GetExecutingAssembly().Location

1

asp.net 응용 프로그램으로 작업 중이고 디버거를 사용할 때 어셈블리를 찾으려면 일반적으로 임시 디렉터리에 저장됩니다. 나는 그 시나리오를 돕기 위해이 방법을 썼다.

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

자세한 내용은이 블로그 게시물 http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/을 참조하십시오.

소스 코드를 변경하거나 재배포 할 수 없지만 컴퓨터에서 실행중인 프로세스를 검사 할 수있는 경우 Process Explorer를 사용합니다. 여기에 자세한 설명을 썼습니다 .

시스템에서 실행중인 모든 dll을 나열하고 실행중인 응용 프로그램의 프로세스 ID를 확인해야 할 수도 있지만 일반적으로 그렇게 어렵지는 않습니다.

IIS 내부의 dll에 대한 전체 설명을 작성했습니다 -http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -섬기는 사람/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.