Мне удалось подготовить доказательство концепции, аналогичное идее прокси, которую вы упомянули.
Проблема, которую вы видите, вызвана регистрацией неправильной сборки, поэтому я создал новый атрибут регистрации с именем ProvideProxyToolboxControlAttribute
, который используется в качестве атрибута прокси-классов, которые есть в вашей сборке интеграции VS. Он почти идентичен ProvideToolboxControlAttribute
за исключением того, что он принимает тип фактического элемента управления. Конечно, этот новый атрибут также будет в вашей сборке VS.
Например, скажем, у меня есть набор инструментов в моей сборке без VS с именем MyToolboxControl
, я бы создал простой прокси-класс MyToolboxControlProxy
в моей сборке VS, который выглядит следующим образом:
[ProvideProxyToolboxControl("MyToolboxControl", typeof(NonVsAssembly.MyToolboxControl))]
public class ToolboxControlProxy
{
}
И, конечно, магия происходит в 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));
}
}
}
Кажется, это работает хорошо, я проверил, что элемент управления находится в наборе инструментов и что были добавлены соответствующие ключи реестра.
Надеюсь, это поможет!