我能够提出类似于您提到的代理想法的概念证明。
您看到的问题是由错误程序集的注册引起的,因此我创建了一个名为的新注册属性ProvideProxyToolboxControlAttribute
,该属性用作您在 VS 集成程序集中拥有的代理类的属性。ProvideToolboxControlAttribute
除了它采用实际控制的类型之外,它几乎相同。当然,这个新属性也会在你的 VS 程序集中。
例如,假设我在非 VS 程序集中有一个名为 的工具箱控件MyToolboxControl
,我将在 VS 程序集中创建一个简单的代理类MyToolboxControlProxy
,如下所示:
[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));
}
}
}
它似乎运行良好,我验证了控件在工具箱中,并且添加了正确的注册表项。
希望这可以帮助!