2011-02-15 3 views
6

WPF 컨트롤 용 VSIX 설치 프로그램을 만들려고합니다.다른 어셈블리에 정의 된 유형의 WPF 도구 상자 설치자

간단하지만 "쉬운"버전은 VSIX 프로젝트에서 WPF 컨트롤을 만드는 것으로 가정합니다.

문제는 내 DLL 중 하나에 깊이 자리 잡고있는 UserControl을 얻었 기 때문에 최상의 디자인이라고 생각하지 않습니다. 거기에두고 싶습니다만,이 작업을 수행 할 수없고 컨트롤을 도구 상자에 추가 할 수 없습니다.

하나의 옵션은 도구 상자에 컨트롤 어셈블리에 설치해야하는 코드를 이동하는 것이지만 Microsoft.VisualStudio.Shell.Immutable.10.0.dll에 종속성을 추가합니다. 이 어셈블리는 Visual Studio가 설치된 사람과 VS가 설치되어 있지 않은 서비스에서 실행되는 원격 서버에서 모두 사용되므로 방해가되지 않습니다.

내가 시도한 또 다른 옵션은 RegistrationAttribute를 프록시에 적용하여 도구 상자 설치 관리자 VSIX를 "트릭"하여 다른 어셈블리에 정의 된 유형을 등록하는 것이 었습니다. 그것이 효과가있을 것이라고 생각했지만 이상한 일이 일어났습니다.

all kinds of weirdness in the toolbox

대신 두 개의 컨트롤을 얻는, 내 네임 스페이스의 일부를 에코 일부 이상한 이름 탭, 국경 통제의 무리 (표준 WPF 경계)을 얻는다.

컨트롤이 VSIX 이외의 어셈블리에 정의되어있을 때 도구 상자에 WPF UserControl을 등록하려면 어떻게해야합니까?

+0

WPF 컨트롤이 VSIX 프로젝트에 있어야한다는 가정은 어디입니까? 또한 "쉬운"버전이란 무엇을 의미합니까? – Matt

+1

@Matt : 도구가 어떻게 설계되었는지는 가정하지 않습니다. MSDN 연습을 [다음] (http://msdn.microsoft.com/en-us/library/ee712573.aspx) 및 [여기] (http://msdn.microsoft.com/en-us/library) 따라 /ee712574.aspx) 또는 설치된 템플릿을 보면 설치 프로그램과 컨트롤을 동일한 프로젝트에서 조합 한 튜토리얼과 템플릿을 볼 수 있습니다. 또는 내 질문에 대한 답변을 시도해 볼 수 있습니다.이 경우 다른 방법으로는 아무 것도 * 쉽지 않습니다. – Will

+0

@ 당신의 요지를 보았습니다. ProvideToolboxControl 속성이 당신이 이야기하는 의존성 인 것처럼 보입니다. – Matt

답변

2

나는 당신이 언급 한 프록시 아이디어와 비슷한 개념 증명을 채찍질 할 수있었습니다.

잘못된 어셈블리 등록으로 인해 발생하는 문제이므로 VS 통합 어셈블리에있는 프록시 클래스의 특성으로 사용되는 ProvideProxyToolboxControlAttribute이라는 새 등록 특성을 만들었습니다. ProvideToolboxControlAttribute과 거의 동일하지만 실제 컨트롤의 유형을 사용합니다. 물론이 새 특성은 VS 어셈블리에도 있습니다.

[ProvideProxyToolboxControl("MyToolboxControl", typeof(NonVsAssembly.MyToolboxControl))] 
public class ToolboxControlProxy 
{ 
} 

물론의 예를 들면 다음과 같습니다

, 나는 다음과 같다 나의 VS 어셈블리에서 간단한 프록시 클래스 MyToolboxControlProxy을 만들 것, 내가 MyToolboxControl라는 내 비 VS 어셈블리 도구 상자 컨트롤이 있다고 마법은 기본적으로 (의견과 매개 변수/오류가 간결 제거 확인) 단지이 클래스 인 ProvideProxyToolboxControlAttribute에서 일어나는 :

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
[System.Runtime.InteropServices.ComVisibleAttribute(false)] 
public sealed class ProvideProxyToolboxControlAttribute : RegistrationAttribute 
{ 
    private const string ToolboxControlsInstallerPath = "ToolboxControlsInstaller"; 
    public ProvideProxyToolboxControlAttribute(string name, Type controlType) 
    { 
     this.Name = name; 
     this.ControlType = controlType; 
    } 

    private string Name { get; set; } 

    private Type ControlType { get; set; } 

    public override void Register(RegistrationAttribute.RegistrationContext context) 
    { 
     using (Key key = context.CreateKey(String.Format(CultureInfo.InvariantCulture, "{0}\\{1}", 
                 ToolboxControlsInstallerPath, 
                 ControlType.AssemblyQualifiedName))) 
     { 
      key.SetValue(String.Empty, this.Name); 
      key.SetValue("Codebase", ControlType.Assembly.Location); 
      key.SetValue("WPFControls", "1"); 
     } 
    } 
    public override void Unregister(RegistrationAttribute.RegistrationContext context) 
    { 
     if (context != null) 
     { 
      context.RemoveKey(String.Format(CultureInfo.InvariantCulture, "{0}\\{1}", 
                 ToolboxControlsInstallerPath, 
                 ControlType.AssemblyQualifiedName)); 
     } 
    } 
} 

잘 작동하는 것 같다, 나는 컨트롤이 도구 상자에와 있다는 것을 확인 홍보 oper 레지스트리 키가 추가되었습니다.

희망이 도움이됩니다.

+0

도움에 감사드립니다. 내가 실제로 이것을 굴려서 나에게 효과가 있는지보기까지 일주일 정도 걸릴 것입니다. – Will

+0

몇 개월 정도면 확인하십시오 ... – Will

+0

@ 2 년 전 말씀드립니다. – TechNyquist

관련 문제