C# 动态编译程序集

C# 动态编译程序集,c#,activex,csc,C#,Activex,Csc,我有以下代码: static void Main(string[] args) { CompilerParameters cp = new CompilerParameters { GenerateInMemory = true, IncludeDebugInformation = false, }; cp.ReferencedAssemblies.AddRange(new string[]{ "System.d

我有以下代码:

static void Main(string[] args)
{
    CompilerParameters cp = new CompilerParameters
    {
        GenerateInMemory = true,
        IncludeDebugInformation = false,

    };

    cp.ReferencedAssemblies.AddRange(new string[]{
        "System.dll",
        "System.Data.dll",
        "System.Xml.dll",
        "Microsoft.mshtml.dll",
        "System.Windows.Forms.dll"
    });

    Assembly _assembly = Assembly.GetExecutingAssembly();
    StreamReader _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("myprog.restext.txt"));

    string src = _textStreamReader.ReadToEnd();
    byte[] code = Convert.FromBase64String(src);

    src = Encoding.UTF8.GetString(code);

    CompilerResults cr = CSharpCodeProvider.CreateProvider("CSharp").
        CompileAssemblyFromSource(cp, src);
    Assembly asm = cr.CompiledAssembly;
    Type typ = asm.GetType("clicker.Program");
    MethodInfo method = typ.GetMethod("DoStart");
    method.Invoke(null, new[] { (object)args });
}
我认为
FileNotFoundException
因为
compileasemblyfromsource
返回相同的错误。源代码使用mshtml

然后我尝试使用csc.exe编译它,它说:

error CS0006. (no Metadata for "Microsoft.mshtml.dll")
我认为这是因为mshtml是ActiveX库。所以问题是如何使用activeX mshtml组装源代码

p、 美国。 源代码没有错误,已从VS成功编译,但无法通过“动态”编译进行编译

我认为FileNotFoundException

这很正常,Microsoft.mshtml.dll是主要的互操作程序集。它不是.NET Framework的一部分,因此无法自动定位。它也不会在用户的机器上提供,必须安装PIA

最好的方法是确保程序集存在于您的构建目录中,以便它将与您的程序一起部署,并且始终可以找到。Project+添加引用,选择Microsoft.mshtml。从“引用”节点中选择它,并将隔离属性设置为False,将本地复制设置为True。重新生成并验证bin\Debug目录中是否存在Microsoft.mshtml.dll

并修改代码以将完整路径名传递给文件。像这样:

    var referenceAssemblies = new List<string> {
        "System.dll",
        "System.Data.dll",
        "System.Xml.dll",
        "System.Windows.Forms.dll" 
    };
    var homedir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    var mshtml = Path.Combine(homedir, "Microsoft.mshtml.dll");
    referenceAssemblies.Add(mshtml);

    cp.ReferencedAssemblies.AddRange(referenceAssemblies.ToArray());
var referenceAssemblies=新列表{
“System.dll”,
“System.Data.dll”,
“System.Xml.dll”,
“System.Windows.Forms.dll”
};
var homedir=Path.GetDirectoryName(Assembly.getExecutionGassembly().Location);
var mshtml=Path.Combine(homedir,“Microsoft.mshtml.dll”);
referenceAssemblies.Add(mshtml);
cp.referencedAssembly.AddRange(referenceAssembly.ToArray());