.NET 9免注册COM类库无manifest输出问题求助
.NET 9 免注册COM类库:Manifest未生成及VBScript调用问题解决
一、Manifest未生成的原因及修复(使用[GeneratedComInterface]/[GeneratedComClass]场景)
你最初使用.NET 8引入的ComWrappers代码生成特性时,仅启用<EnableRegFreeCom>true</EnableRegFreeCom>不足以触发manifest文件生成。该特性下,RegFree COM的manifest生成依赖于COM宿主托管功能的启用。
修复步骤:
- 在项目文件中添加
<EnableComHosting>true</EnableComHosting>配置,与EnableRegFreeCom配合使用:
<PropertyGroup> <TargetFramework>net9.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> <EnableRegFreeCom>true</EnableRegFreeCom> <EnableComHosting>true</EnableComHosting> </PropertyGroup>
- 重新执行
dotnet build,输出目录会生成包含COM注册信息的manifest文件。
注:[GeneratedComInterface]/[GeneratedComClass]是.NET 8+的新特性,用于自动生成ComWrappers相关代码,相比传统ComVisible方式更高效,但需确保配置项完整。
二、生成Manifest后VBScript(Classic ASP)调用失败的解决
修改为传统ComVisible方式后生成了manifest,但仍存在调用错误,可从以下几点排查:
1. 确保COM可见性与GUID配置正确
类和接口需明确标记[ComVisible(true)],且接口、类需分别指定唯一GUID:
using System.Runtime.InteropServices; namespace testComLib; [ComVisible(true)] [Guid("e9cbe871-533e-48b5-b33f-a296a98a51cc")] public interface IClass1 { int Poke(int count); } [ComVisible(true)] [Guid("f4d1a8f0-7d0a-45c1-8f2e-9d7b3c6e1234")] // 替换为新的唯一GUID public class Class1 : IClass1 { public int Poke(int count) => count + 2; }
2. 检查Manifest内容的正确性
编译生成的manifest需包含CLSID、ProgID、接口信息及.NET运行时依赖,示例正确片段:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="testComLib" version="1.0.0.0" processorArchitecture="x86" /> <file name="testComLib.dll"> <comClass clsid="{f4d1a8f0-7d0a-45c1-8f2e-9d7b3c6e1234}" progid="testComLib.Class1" threadingModel="Both" /> <comInterfaceExternalProxyStub iid="{e9cbe871-533e-48b5-b33f-a296a98a51cc}" name="IClass1" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" /> </file> <dependency> <dependentAssembly> <assemblyIdentity name="Microsoft.NETCore.App" version="9.0.0" processorArchitecture="x86" publicKeyToken="7cec85d7bea7798e" /> </dependentAssembly> </dependency> </assembly>
3. VBScript调用方式修正
你遇到的"ActiveX component can't create object: 'GetObject'"错误,大概率是调用方式错误。免注册COM对象应使用CreateObject而非GetObject:
' 正确调用方式 Set obj = CreateObject("testComLib.Class1") result = obj.Poke(5) WScript.Echo result ' 应输出7
4. 匹配平台架构(关键)
Classic ASP通常运行在IIS的32位应用程序池中,因此.NET类库需编译为x86平台:
- 在项目文件中添加
<PlatformTarget>x86</PlatformTarget>:
<PropertyGroup> <!-- 其他配置 --> <PlatformTarget>x86</PlatformTarget> </PropertyGroup>
- 确保IIS应用程序池的“启用32位应用程序”选项设置为
True(IIS管理器 → 应用程序池 → 高级设置)。
5. 验证RegFree COM加载
可使用微软mt.exe工具验证manifest有效性,或通过进程监视器跟踪COM对象加载过程,确认是否正确读取manifest文件。
内容的提问来源于stack exchange,提问作者Avenger
相关产品推荐
相关产品推荐

