视觉样式不适用于进程内COM服务器

ste*_*nio 6 .net c# com plugins winforms

我正在开发一个使用视觉样式的程序.Main方法如下所示:

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}
Run Code Online (Sandbox Code Playgroud)

该程序也可以作为另一个应用程序的插件,在这种情况下,它通过COM启动.问题是调用应用程序(COM客户端)不调用EnableVisualStyles,它不受我的控制.在这种情况下,程序启动如下:

public static void StartAsPlugin() {
   Application.EnableVisualStyles();
   Form form = new Form();
   form.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

当程序作为插件启动时,进度条和组合框不会呈现与程序正常启动时相同的样式,而按钮,复选框和单选按钮都可以.有没有办法强制视觉风格?我试过清单,但没有运气!这是我试过的清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="RealApp"
    type="win32"
/>
<description>Your application description here.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)

我认为清单是正确嵌入的,因为ildasm在清单部分显示以下内容:

.mresource public RealApp.RealApp.exe.manifest
{
  // Offset: 0x000004F0 Length: 0x0000029B
}
Run Code Online (Sandbox Code Playgroud)

谢谢,Stenio

Ben*_*Ben 2

用 Raymond Chen 的话说,插件是主机进程中的客人,不应该改变地毯。

http://blogs.msdn.com/b/oldnewthing/archive/2010/04/30/10004931.aspx

无法打开它们,因为这实际上不是您应该做的事情。

如果主机进程不想使用视觉样式,您可能不应该使用它们。当托管在没有视觉样式的应用程序中时,请考虑允许您的插件在没有视觉样式的情况下呈现。

否则,请参阅上面@Ken的建议。