【问题标题】:CodeDom reference to COMCodeDom 对 COM 的引用
【发布时间】:2014-08-12 14:59:46
【问题描述】:

我目前正在开发一个使用 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);

希望有人能帮帮我...

【问题讨论】:

  • wshom.ocx 不是 .NET 程序集,它是一个 activeX 控件 DLL
  • 是的,但是我怎样才能添加对它的引用呢?在 Visual Studio 中,它列在参考管理器的“COM”下
  • 我认为tlbimp.exe 可能是您需要的。

标签: c# codedom csharpcodeprovider


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2014-12-09
    • 2012-07-21
    • 1970-01-01
    • 2014-12-18
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多