You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Side-by-Side程序集的MS Unit Test无法加载免注册COM DLL求助

解决方案
  • 验证嵌入清单的正确性
    先用mt.exe工具提取测试DLL里的嵌入清单,确认COM组件的配置是否准确:

    mt.exe -inputresource:testProjectAssemblyname.dll;#1 -out:extracted.manifest
    

    检查提取出的清单中,<file>标签的name是否对应你的COM DLL文件名,<comClass>的clsid是否和报错里的CLSID完全一致,processorArchitecture是否和COM DLL的位数(X86/x64)匹配。

  • 改用独立清单文件
    部分测试运行环境对嵌入清单的支持不佳,把testProjectAssemblyname.dll.manifest直接放在测试DLL的输出目录下,同时在测试初始化代码里强制设置工作目录为测试输出路径:

    [TestInitialize]
    public void Setup()
    {
        Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
    }
    
  • 强制匹配测试宿主的位数
    即使测试项目切换了编译平台,测试宿主进程(如vstest.console.exe)可能仍以不匹配的位数运行。在测试项目的属性→测试选项卡中,设置“默认处理器架构”为X86或x64,确保和你的COM DLL位数完全一致。

  • 完善清单中的COM组件定义
    如果COM DLL自身没有附带SxS清单,测试清单必须完整包含COM组件的注册信息,示例结构:

    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity name="testProjectAssemblyname" version="1.0.0.0" processorArchitecture="x86" type="win32"/>
      <file name="YourComDll.dll">
        <comClass clsid="{你的CLSID}" progid="YourCom.ProgID" threadingModel="apartment"/>
        <comInterfaceProxyStub iid="{接口IID}" baseInterface="{00000000-0000-0000-C000-000000000046}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"/>
      </file>
    </assembly>
    

    注意processorArchitecture不能写通配符,必须和COM DLL的位数严格对应。

  • 手动激活Side-by-Side上下文
    在测试初始化阶段调用Windows API加载COM DLL的清单,强制激活SxS上下文,示例代码:

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    [TestClass]
    public class YourTestClass
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
        private const uint LOAD_LIBRARY_AS_DATAFILE = 0x00000002;
    
        [TestInitialize]
        public void TestInitialize()
        {
            var manifestPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "YourComDll.dll.manifest");
            LoadLibraryEx(manifestPath, IntPtr.Zero, LOAD_LIBRARY_AS_DATAFILE);
        }
    
        // 你的测试方法...
    }
    

内容的提问来源于stack exchange,提问作者Peter Jaghorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:07:06