C#中的LaunchAdvancedAssociationUI - >在Windows 8上找不到元素

时间:2015-02-08 11:51:50

标签: c# windows-8 com com-interop

我试图设置一种方法来管理我在C#中的程序的文件关联。我已经在注册表中使用WiX设置了正确的值,并找到了ApplicationAssociationRegistrationUI的包装器,它应该允许我打开GUI来设置文件关联。但它不起作用。我得到以下异常:找不到元素。 (HRESULT的例外情况:0x80070490)

包装器:

namespace FileAssociation
{
    [ClassInterface(ClassInterfaceType.None)]
    [ComImport]
    [Guid("1968106d-f3b5-44cf-890e-116fcb9ecef1")]
    [TypeLibType(TypeLibTypeFlags.FCanCreate)]
    public sealed class ApplicationAssociationRegistrationUI : IApplicationAssociationRegistrationUI
    {
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern void LaunchAdvancedAssociationUI(string appRegistryName);
    }

    [CoClass(typeof(ApplicationAssociationRegistrationUI))]
    [ComImport]
    [Guid("1f76a169-f994-40ac-8fc8-0959e8874710")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [TypeLibImportClass(typeof(ApplicationAssociationRegistrationUI))]
    public interface IApplicationAssociationRegistrationUI
    {
        void LaunchAdvancedAssociationUI([MarshalAs(UnmanagedType.LPWStr)] string appRegistryName);
    }
}

用法:

var assocUi = new ApplicationAssociationRegistrationUI();
try
{
     assocUi.LaunchAdvancedAssociationUI(InstanceManager.ProgId);
}
catch
{
     MessageBox.Show("Could not display the file association manager. Please repair the installation and try again.", "Error", MessageBoxButton.OK, MessageBoxImage.Warning);
}
finally
{
     Marshal.ReleaseComObject(assocUi);
}

同样,注册表中存在所有正确的密钥。这不是COM Interop第一次对我失败,所以我开始认为我必须遗漏一些重要的东西。我尝试检查"注册COM Interop"在项目属性中,我尝试将其设为COM-Visible。

我知道这只适用于Vista或更新版本,这很好,因为我的程序无论如何都不支持XP。我在Windows 8.1上测试它,包括管理员和普通用户。

编辑:它适用于Windows 7!在MSDN上,它没有说在Win8中不推荐使用这个API ...

我做错了什么?有没有更简单的方法来做到这一点,我不知道?

1 个答案:

答案 0 :(得分:1)

终于找到了问题!!! 从Windows 8开始,该程序需要有公司信息(我认为这是一个错误,因为在微软的网站上没有提到它。) 因此,请确保在AssemblyInfo.cs中填写此属性:

[assembly: AssemblyCompany("YourCompany")]

如果它是一个空字符串,它将无效!