使用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
相关产品推荐
相关产品推荐

