CSharpCodeProvider 如何引用当前程序集
CSharpCodeProvider how to reference current assembly
我正在尝试使用 CSharpCodeProvider 动态编译代码。在引用的程序集中,我按照建议 here,为 typeof(Program).Assembly.CodeBase) 添加了一个引用参数,但它不起作用。我仍然收到一条错误消息
error CS0006: Metadata file 'file:///C:/Code/MyProject/bin/MyProject.DLL' could not be found;
确实存在同名文件 - 唯一的区别是文件扩展名在文件资源管理器 (.dll) 中显示为小写,但除此之外,错误消息中的文件名与 dll 的名称和路径相匹配我要参考
知道为什么编译器在这种情况下无法看到引用的 dll 吗?
这是我的代码的相关部分:
CompilerResults result = null;
CompilerParameters parms = new CompilerParameters();
parms.GenerateExecutable = false;
parms.GenerateInMemory = true;
parms.OutputAssembly = "MyOutputAssembly";
parms.ReferencedAssemblies.Add("System.dll");
parms.ReferencedAssemblies.Add("System.Data.dll");
parms.ReferencedAssemblies.Add("mscorlib.dll");
parms.ReferencedAssemblies.Add(typeof(Program).Assembly.CodeBase); // Reference the current assembly
// Lock because CSharpCodeProvider can only compile the code once per time slot
lock (lockCompile)
{
using (CSharpCodeProvider codeProvider = new CSharpCodeProvider())
{
result = codeProvider.CompileAssemblyFromSource(parms, new string[] { code.ToString() });
}
}
尝试使用 typeof(Program).Assembly.Location
而不是 .CodeBase
。程序集上的 .Location
属性 将 return 到加载的实际文件的 straight-up 路径,而 .CodeBase
return 是典型位置以 URI 形式。我不确定,但我认为可能存在与加载 remotely-hosted 代码相关的场景,其中 .Location
不会给你任何东西,而 .CodeBase
可能会给你例如http
URI,但在你的场景中,听起来你的程序集总是本地的,所以你应该始终有一个有效的 .Location
值。 :-)
我正在尝试使用 CSharpCodeProvider 动态编译代码。在引用的程序集中,我按照建议 here,为 typeof(Program).Assembly.CodeBase) 添加了一个引用参数,但它不起作用。我仍然收到一条错误消息
error CS0006: Metadata file 'file:///C:/Code/MyProject/bin/MyProject.DLL' could not be found;
确实存在同名文件 - 唯一的区别是文件扩展名在文件资源管理器 (.dll) 中显示为小写,但除此之外,错误消息中的文件名与 dll 的名称和路径相匹配我要参考
知道为什么编译器在这种情况下无法看到引用的 dll 吗?
这是我的代码的相关部分:
CompilerResults result = null;
CompilerParameters parms = new CompilerParameters();
parms.GenerateExecutable = false;
parms.GenerateInMemory = true;
parms.OutputAssembly = "MyOutputAssembly";
parms.ReferencedAssemblies.Add("System.dll");
parms.ReferencedAssemblies.Add("System.Data.dll");
parms.ReferencedAssemblies.Add("mscorlib.dll");
parms.ReferencedAssemblies.Add(typeof(Program).Assembly.CodeBase); // Reference the current assembly
// Lock because CSharpCodeProvider can only compile the code once per time slot
lock (lockCompile)
{
using (CSharpCodeProvider codeProvider = new CSharpCodeProvider())
{
result = codeProvider.CompileAssemblyFromSource(parms, new string[] { code.ToString() });
}
}
尝试使用 typeof(Program).Assembly.Location
而不是 .CodeBase
。程序集上的 .Location
属性 将 return 到加载的实际文件的 straight-up 路径,而 .CodeBase
return 是典型位置以 URI 形式。我不确定,但我认为可能存在与加载 remotely-hosted 代码相关的场景,其中 .Location
不会给你任何东西,而 .CodeBase
可能会给你例如http
URI,但在你的场景中,听起来你的程序集总是本地的,所以你应该始终有一个有效的 .Location
值。 :-)