none
编译、注册DLL在不同windows下的兼容性问题 RRS feed

  • 问题

  • IE异步协议需要编写DLL来实现,建一个类库项目,导入一大堆COM里的东西,选择密钥、选择对COM开放。。。然后编译,再使用gacutil.exe和regAsm进行注册。

    现在遇到问题是,就算不同机器上.net平台版本相同,VS版本相同,XP下编译后在本机能使用的DLL放到win7下就不能用。反之亦然。异常提示"与预期值不一样"。我知道可能和项目GUID及项目里类的GUID有关。对此我进行了各种尝试(项目GUID和类GUID相同或不同,是否在编译选择注册COM Interop),还是不能兼容不同windows平台(上面.net运行库版本一样)。我想请教下这方面专家,还有什么因素会导致这种.net版本的COM DLL如此难以使用?如果难以兼容,微软弄出这玩意来干嘛?

    2013年12月23日 4:04

全部回复

  • 兼容,在 Win7 下注册需要管理员权限。注册后最好查看一下 HKLM 下是否有对应的 COM 键值。

    在 Win7 下的 COM 访问规则是,宿主 COM 的进程和调用 COM 的进程必须具有相同的权限。

    如果以上都没有问题的话,你的问题应该和 IE 相关。另外“与预期值不一样”异常的具体位置是哪儿?

    2013年12月23日 7:00
  •     public static class RegisterApp
        {
            [DllImport("urlmon.dll")]
            private static extern void CoInternetGetSession(uint sessionMode,
            ref IInternetSession session, uint reserved);
    
            [DllImport("ole32.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
            public static extern int CoGetClassObject(
            ref Guid rclsid, CLSCTX dwClsContext,
            IntPtr pServerInfo, ref Guid riid,
            [Out, MarshalAs(UnmanagedType.Interface)] out object ppv);
    
            public const uint CLSCTX_INPROC_SERVER = 1;
            public const uint CLSCTX_INPROC_HANDLER = 2;
            public const uint CLSCTX_LOCAL_SERVER = 4;
            public const uint CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER;
    
            public static void Register()
            {
                object ic = new object();
                Guid guid = new Guid("1c470f4b-0486-4558-80c7-ad08d652a465");
                Guid guid2 = new Guid("00000001-0000-0000-C000-000000000046");
    
                CoGetClassObject(ref guid, CLSCTX.INPROC_SERVER | CLSCTX.LOCAL_SERVER, IntPtr.Zero, ref guid2, out ic);
                IInternetSession s = null;
                CoInternetGetSession(0, ref s, 0);
                s.RegisterMimeFilter((IClassFactory)ic, ref guid, "text/html");//异常出现在这里
                
            }
        }
    异常出现在RegisterMimeFilter或RegisterNameSpace上。
    2013年12月24日 9:04