2010-06-02 3 views
6

저는 두 개의 서로 다른 C# 응용 프로그램을 동시에 실행하고 있습니다.동일한 DLL 데이터를 두 개의 서로 다른 프로세스에서 공유 할 수 있습니까?

두 사람 모두 DLL의 동일한 "인스턴스"(C#에서도)에 액세스 할 수 있기를 바랍니다.

DLL에는 두 개의 응용 프로그램 중 어느 곳으로 보내고 싶은 데이터가 들어 있습니다.

내 DLL은 스레드로부터 안전하므로이 방법이 가능할 것으로 기대했지만 확실하지 않습니다.

도움이나 조언을 주시면 감사하겠습니다.

+2

DLL은 단순히 선형 데이터 및 코드 모음을 넣습니다. 즉, "개체"처럼 구조화되지 않은 것은 C#에 있습니다. DLL은 어떻게 인스턴스가 될 수 있습니까? 코드 및 데이터 공유를 의미하는 경우; 이것은 OS에 따라 다릅니다. – Pindatjuh

답변

5

프로세스 공간이 다를 수 있습니다. 예를 들어 DLL의 전역 변수는 각 개별 프로세스마다 다릅니다. 메모리의 코드가 공유 될 수 있습니다 (Windows는 일반적으로 참조 계산을 사용하여 해당 부분을보다 효율적으로 만듭니다).

두 프로세스간에 DLL에서 액세스되는 정보를 공유하려는 경우 소켓, 공유 메모리, 파이프와 같은 일종의 IPC (프로세스 간 통신) 메커니즘을 사용해야 할 수 있습니다. 등

+0

그래서 두 개의로드 된 DLL이 말하면 명명 된 파이프를 통해 서로 대화 할 것입니다. –

+0

@ Jelly Amma : 구현하면 파이프를 통해 서로 대화 할 수 있습니다. 그것이 당신이 요구하는 것이라면 자동적이지 않습니다. –

0

DLL에는 인스턴스가 없으므로 호스트 프로세스에로드됩니다. 두 응용 프로그램에서 어셈블리를 참조하고 해당 클래스/메서드를 사용합니다.

두 응용 프로그램 모두에 동일한 어셈블리를 배포하지 않으려면 put it in the GAC 수 있습니다.

0

가능합니다. 두 응용 프로그램에서 쉽게 액세스 할 수 있도록하기 위해 GAC에 DLL을 설치할 수 있습니다 (강력한 어셈블리가 필요함).

또는 폴더에 스틱을 넣어 두 앱이 해당 폴더에서 DLL을 검색하도록합니다.

MSDN support article

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="MyAssembly2" culture="neutral" publicKeyToken="307041694a995978"/> 
      <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
0

이 C#으로하지만, C에서 할 수 있으면 공유 할 수있는 정보가 너무 복잡하지 않은 경우 당신은 또한 공유 메모리 섹션을 사용할 수 있습니다 ++ 모르겠어요. 당신은 단순히 뮤텍스

에게 예를 들어 주제에 대한 좋은 기사를 사용하여이 ressource에 대한 액세스를 동기화해야합니다 : http://www.codeproject.com/KB/threads/SharedMemory_IPC_Threads.aspx

이 가진 재미

0

당신의 DLL이 메모리 나 디스크에 명명 된 메모리 맵 파일을 (만드는 경우) 두 응용 프로그램은 DLL에 의해 생성 된 메모리를 공유 할 수 있습니다. 각 응용 프로그램은 공유 메모리와 다른 포인터를 가지지 만 실제로 메모리는 공유됩니다. 공유 메모리에 동일한 이름을 사용해야하며 프로세스간에 스레드 안전성이 보장됩니다. (명명 된 세마포어 또는 뮤텍스가 작동합니다. CriticalSection은 작동하지 않습니다.)