Tag: 程序集

CompilerParameters.ReferencedAssemblies – 添加对System.Web.UI.WebControls的引用

我正在使用CodeDomProvider类在运行时编译类。 这适用于仅使用System命名空间的类: using System; public class Test { public String HelloWorld() { return “Hello World!”; } } 如果我尝试使用System.Web.UI.WebControls编译一个类,我收到此错误: {error CS0006:无法找到元数据文件’System.Web.UI.WebControls’} System.CodeDom.Compiler.CompilerError 这是我的代码片段: var cp = new CompilerParameters(); cp.ReferencedAssemblies.Add(“System.Web.UI.WebControls”); 如何引用System.Web.UI.WebControls命名空间?

在类库中处理AssemblyResolve事件的位置?

我需要动态地解决从一个类库到另一个类库的程序集引用。 类库是从PowerShell脚本加载的,因此在可执行文件中查找依赖程序集的默认.NET行为会直接失败,因为可执行文件是PowerShell本身。 如何使这些依赖的程序集引用解析/正常工作? 更详细 : 我有两个实用程序库:一个核心库和另一个执行一些非常具体的解析任务的实用程序库。 我想在PowerShell脚本中动态加载它们, 而无需在GAC中安装它们 。 第二个库取决于第一个库。 在VS解决方案中,解析库具有对核心库的项目引用, Copy Local = true 。 使用后,我可以在解析库输出bin(/ Debug | / Release)文件夹中加载和使用这两个库(PowerShell here): [Reflection.Assembly]::LoadFile(“C:\…thefile.dll”) 但是,每当在解析(依赖)库中调用一个从核心库调用某些东西的方法时,它就无法解析核心程序集。 这是令人沮丧的…因为文件在同一个文件夹中。 一个或两个是否具有强名称密钥没有区别。 我现在的解决方法是处理AssemblyResolve事件。 棘手的是找出将它放在类库中的位置,因为在可执行的Main()方法之前没有任何单一的入口点总是会先执行其他任何东西(请参阅类库中是否存在等效的Application_Start)在c# )。 现在我已经创建了一个带有静态构造函数的静态Resolver类,它为AssemblyResolve附加了一个处理程序,然后在每个解析类中都有一个静态构造函数,它引用了静态解析程序类,强制解析器类的静态构造函数执行。 结果是AssemblyResolve事件只被连接一次,并使用通用的中央代码进行处理。 所以它有效。 但我不想在我的所有解析类中添加一个时髦的静态构造函数。 有没有更好的方法来处理这个?

通过PublicKeyToken防止外部程序集注入

我正在使用以下代码: AppDomain.CurrentDomain.AssemblyLoad += (sender, args) => { var token = args.LoadedAssembly.GetName().GetPublicKeyToken(); if (!IsValidToken(token)) { Process.GetCurrentProcess().Kill(); } }; IsValidToken()将正在加载的程序集的公钥标记与我的应用程序中硬编码的授权公钥标记列表作为字节数组进行比较。 这是防止代码注入攻击的良好安全措施吗? 此外,鉴于我稍后将使用NetReactor对我的应用程序进行模糊处理,这是否必要? 我试图阻止任何“窥探”我的应用程序,不仅来自Snoop工具,而且来自任何外部不受欢迎的来源。

Sql Server CLR加载程序集失败

我正在尝试部署CLR TVF(表值函数)。 在代码中我使用JavaScriptSerializer来解析一些JSON字符串,所以我引用了System.Web.Extensions dll,我的问题从那里开始。 项目构建正常,但当我尝试注册该DLL时,我收到以下错误: 程序集“my_assembly_name”引用程序集“system.web.extensions,version = 4.0.0.0,culture = neutral,publickeytoken = 31bf3856ad364e35。”,这在当前数据库中不存在。 SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:2(系统找不到指定的文件。))。 请将引用的程序集加载到当前数据库中,然后重试您的请求。 我从以下url引用了system.web.extensions: C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Web.Extensions.dll 我可以将copy load设置为true或手动复制程序集,但随后引用错误会更深入 – 程序集“my_assembly_name”引用程序集“system.servicemodel.activation,version = 4.0.0.0,culture = neutral,publickeytoken = 31bf3856ad364e35。”,它在当前数据库中不存在。 SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:2(系统找不到指定的文件。))。 请将引用的程序集加载到当前数据库中,然后重试您的请求。 一切正常,直到我引用Web.Extensions.dll。 目标框架是.NET 4。 任何想法/解决方案?

mscorlib.XmlSerializers.DLL的FileNotFoundException,它不存在

我正在使用XmlSerializer来反序列化mscorelib.dll中的特定类型 XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) ); return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) ); 这会在加载程序集时抛出捕获的FileNotFoundException : “无法加载文件或程序集’mscorlib.XmlSerializers,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089’或其中一个依赖项。系统找不到指定的文件。” FusionLog: === Pre-bind state information === LOG: User = ### LOG: DisplayName = mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86 (Fully-specified) LOG: Appbase = […]

C#使用Assembly调用DLL中的方法

我一直在读这个 – 我觉得我非常接近答案。 我只是想从我创建的dll文件中调用一个方法。 例如: 我的DLL文件: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ExampleDLL { class Program { static void Main(string[] args) { System.Windows.Forms.MessageBox.Show(args[0]); } public void myVoid(string foo) { System.Windows.Forms.MessageBox.Show(foo); } } } 我的应用程序: string filename = @”C:\Test.dll”; Assembly SampleAssembly; SampleAssembly = Assembly.LoadFrom(filename); // Obtain a reference to a method known to […]

appDomain.Unload(domain)后如何删除pluginassembly

我有一个奇怪的问题。 我想删除已加载的程序集(硬盘上的plugin.dll),但程序集被操作系统(vista)锁定,即使我已卸载它。 FE AppDomainSetup setup = new AppDomainSetup(); setup.ShadowCopyFiles = “true”; AppDomain appDomain = AppDomain.CreateDomain(assemblyName + “_AppDomain”, AppDomain.CurrentDomain.Evidence, setup); IPlugin plugin = (IPlugin)appDomain.CreateInstanceFromAndUnwrap(assemblyName, “Plugin.MyPlugins”); 我还需要assemblyinfos,因为我不知道pluginassembly中的哪些类实现了IPlugin接口。 在一个Pluginassembly中应该可以有多个插件。 Assembly assembly = appDomain.Load(assemblyName); if (assembly != null) { Type[] assemblyTypes = assembly.GetTypes(); foreach (Type assemblyTyp in assemblyTypes) { if (typeof(IPlugin).IsAssignableFrom(assemblyTyp)) { IPlugin plugin = (IPlugin)Activator.CreateInstance(assemblyTyp); plugin.AssemblyName = assemblyNameWithEx; […]

以原生速度运行动态编译的C#代码……怎么样?

我已经阅读了几篇关于编写和编译动态C#代码的post。 例如, 这篇文章 。 我知道它可以通过几种方式完成。 但是,调用代码调用程序很慢。 我做了一个简单的基准测试,它比调用本机方法慢了约500倍。 我想要做的是相当于加载DLL并直接调用其中一个方法(“本机”),这将提供我想要的速度优势。 最简单的方法是什么? 将动态代码编译为dll然后加载它? 可以在记忆中完成吗? 编辑 我不关心编译时间。 只执行。 编辑2,3 这是我写的基准代码: public static int Execute(int i) { return i * 2; } private void button30_Click(object sender, EventArgs e) { CSharpCodeProvider foo = new CSharpCodeProvider(); var res = foo.CompileAssemblyFromSource( new System.CodeDom.Compiler.CompilerParameters() { GenerateInMemory = true, CompilerOptions = @”/optimize”, }, @”public class […]

从汇编中读取嵌入文件

我必须将配置文件的路径传递给框架方法(Gurok SmartInspect)。 配置文件是程序集的嵌入式资源。 目前,我从程序集中读取文件并将其存储在外部,然后传递pathName。 有没有更好/更简单的方法来实现这个目标,而不复制文件? private static void ConfigLogger() { const string embeddedFileName = “xxx.SmartInspect.properties”; const string configFileName = “SmartInspect.properties”; ExtractFileFromAssembly(embeddedFileName, configFileName); SiAuto.Si.LoadConfiguration(configFileName); } private static void ExtractFileFromAssembly(string assemblyFileName, string configFileName) { using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(assemblyFileName) ) { byte[] buffer = new byte[s.Length]; int read = s.Read(buffer, 0, (int)s.Length); using (FileStream fs = new […]

定位程序集的非特定版本

我试图不针对一个特定版本的DLL,但我不太确定如何。 我已将程序集属性上的选项特定版本设置为false,但是如果我尝试运行应用程序并且所请求的程序集的版本是前一个,我得到一个: FileLoadException: Could not load file or assembly 当引用的dll版本与当前版本不完全匹配时,会发生这种情况。 我认为问题在于如何引用这个程序集。