2012-01-23 6 views
4

FireBreath Framework를 사용하여 브라우저 플러그인을 만들고 있습니다. 대부분의 논리는 C#으로 작성되었으며 브라우저에서 호출하기 위해 C++ 래퍼를 만들었습니다. 브라우저는 C# 프로젝트의 실제 로직을 호출하는 "proxy"Managed C++ 코드를 호출하는 C++ 네이티브 코드를 호출합니다.C++과 C# 사이의 사이드 종속성

그래서 나는 3 DLL을 가지고 관리되는 C++에 따라

  • 헤드 네이티브 C++ DLL을;
  • C#에 종속 된 Managed C++;
  • C# dll에는 주 논리가 들어 있습니다. 사용자 디렉토리에 설치

모든 3 DLL은 :

문제는 C#을 DLL을로드하지 않는 브라우저입니다 (C \ 사용자 1.0.0.0 \의 AppData \ 로밍 \ MyCompany \ MyApp를 \\). 사이드 바이 사이드 매니페스트를 사용하여 종속성을 선언합니다.

는 I 어셈블리 선언 별도 매니페스트 파일을 만들려고 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/> 
    <file name="FirstDependency.dll"/> 
    <file name="SecondDependency.dll"/> 
</assembly> 

및 헤드 DLL (네이티브 C++)이 종속성에 링크가 추가

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

또한 I는하려 head dll (Native C++)에서 직접 종속성 선언 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <file name="FirstDependency.dll"/> 
    <file name="SecondDependency.dll"/> 
</assembly> 

종속적 인 d 의 #pragma 지시어를 사용하여 LLS는 :

#pragma comment(linker, "\"/manifestdependency:type='win32' name='FirstDependency' version='1.0.0.0' processorArchitecture='X86' language='*'\"") 
#pragma comment(linker, "\"/manifestdependency:type='win32' name='SecondDependency' version='1.0.0.0' processorArchitecture='X86' language='*'\"") 

내가 종속성 워커를 사용하여 종속성을 확인하고 그것을 관리 C++와 C#과 어떤 종속성이 존재하지 않습니다 확인했다.

플러그인이 head dll (Native C++)에 액세스 할 수 있으며 Managed C++에서 Managed C++이 C# dll - 호출을 호출 할 때 C# 어셈블리를 찾을 수없는 경우에도 Managed C++를로드합니다.

브라우저 응용 프로그램 (firefox.exe 또는 chrome.exe)과 동일한 디렉토리에 C# dll을 넣으면 작동합니다.

Managed C++ & C#에서 Side By Side 종속성이 작동하지 않는 것 같습니다.

내 플러그인에 종속 DLL을 어떻게로드 할 수 있습니까?

+0

FireBreath IRC 방에서 이에 관해 문의하십시오. 불행히도, 나는 이것을 한 번도 해 본 적이 없기 때문에 나는 모릅니다. 플러그인이 되어도 다른 응용 프로그램과 전혀 다르지 않습니다. 단, 응용 프로그램 자체가 아닌 다른 DLL을로드하는 DLL 만 수정할 수 있다는 점만 다릅니다. – taxilian

답변

0

Firebreath 또는 어셈블리 종속성 매니페스트에 대해 알지는 못하지만 잠재적 인 해결 방법이 있습니다.

C++ 네이티브 코드와 C# 사이에 C++/CLI to provide a wrapper을 사용 해본 적이 있습니까? VisualStudio에서 Windows에서 컴파일하는 경우/clr 스위치를 설정하여 혼합 관리/원시 코드를 허용하도록 C++ 라이브러리를 만들 수 있습니다. 그런 다음 혼합 된 C++/CLI dll에서 직접 C# 어셈블리를 참조하여 직접 호출 할 수 있습니다. C# 어셈블리가 동일한 디렉토리에 있으면 작동해야합니다.

실제로 하나만 더 가서 전체 어셈블리를 혼합 C++/CLI로 정의하면 관리되는 모든 요소를이 DLL로 가져올 수 있습니다. 이미 C#으로 광범위한 코드를 작성했다면이 작업을 권장하지 않지만 미래에 대해 고려해야 할 사항입니다.

최고,

+0

나는 3 개의 dll을 가지고 있습니다 - 네이티브 C++, Managed C++/CLI, C#. 그래서 이미 C++/CLI 라이브러리를 관리 형/비 관리 형 코드 사이의 프록시로 사용합니다. –

+0

@AndreyOsipov doh shucks. 좋아, 나는 신선한 제안이 없다. –

2

해결되었습니다.

사용자 디렉터리에서 C# 어셈블리를로드하는 C++/CLI 프록시 어셈블리에 ResolveEventHandler 처리기가 추가되었습니다.