CodeDom对COM的引用

时间:2014-08-12 14:59:46

标签: c# codedom csharpcodeprovider

我目前正在开发一个使用CSharpCodeProvider生成可执行文件的程序。我需要添加对COM-Lib的引用(“Windows脚本宿主模型”(wshom.ocx))。该文件位于sysWOW64-Path中。每次我尝试编译文件时,它都会给我一个错误:

  

“无法打开元数据文件'c:\ Windows \ SysWOW64 \ wshom.ocx' -   “试图加载格式不正确的程序。”

问题不是平台问题:无论我设置为平台,都会出现错误。我试着设置/ platform:x86参数;我试图将“Builder”的平台改为x86,但它没有解决问题。

这是我用来编译的代码:

        CSharpCodeProvider provider = new CSharpCodeProvider(d);
        ICodeCompiler icc = provider.CreateCompiler();
        CompilerParameters parameters = new CompilerParameters();
        parameters.IncludeDebugInformation = false;
        parameters.OutputAssembly = destinationDialog.FileName;
        parameters.GenerateExecutable = true;
        parameters.TreatWarningsAsErrors = false;
        parameters.ReferencedAssemblies.Add("System.dll");
        parameters.ReferencedAssemblies.Add("System.Core.dll");
        parameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll");
        parameters.ReferencedAssemblies.Add("System.Drawing.dll");
        parameters.ReferencedAssemblies.Add("System.Management.dll");
        parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
        parameters.ReferencedAssemblies.Add("System.XML.dll");
        parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
        parameters.ReferencedAssemblies.Add(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) + @"\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Speech.dll");
        parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
        parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
        parameters.ReferencedAssemblies.Add(GetSystemDirectory() + "\\wshom.ocx");
        parameters.CompilerOptions = "/unsafe /target:winexe /platform:x86";
        CompilerResults results = icc.CompileAssemblyFromSource(parameters, uss);

我希望有人可以帮助我...

1 个答案:

答案 0 :(得分:0)

在C#项目中添加COM引用时,VS实际上会为原始COM库中定义的类型创建一个interop程序集的运行时元数据,因此对于您的情况,您应该为washom.ocx创建一个interop程序集,并且参考那个集会。

如何生成互操作程序集,可以使用tlbimp.exe