Tag: .net assembly

如何以编程方式确定是否在GAC中安装了.NET程序集?

如果程序集在本地计算机上的GAC(全局程序集缓存)中注册,那么以编程方式检查的最简单方法是什么? 是否有一些易于使用的.NET API,我可以给它一个程序集DLL或Assembly对象本身的位置,以检查它是否存在于本地机器上的GAC中? 在我的情况下,我正在检查的程序集已经加载到程序检查的当前AppDomain中,因此我不确定调用Assembly.ReflectionOnlyLoad并且捕获exception将像我在其他post中看到的那样工作,加上看来有点hacky。 理想情况下,我想避免调用像gacutil.exe这样的外部可执行文件来检查。

Visual Studio如何知道源文件是否与原始版本匹配?

我想出了.NET程序集.dll文件如何使用GUID( 博客 )映射到.pdb。 当我调试到一个程序集并询问源代码时,如果我导航到一个文件,它可能会告诉我源代码与原始代码不同。 怎么知道这个? 我原以为.pdb文件包含每个文件的校验和,但它似乎没有。 我发现转储调试信息的最佳工具是dia2dump 。 C ++ .pdb文件有MD5条目,但C#.pdb文件没有。 C ++转储 dia2dump -f dia2dump.pdb> dia2dump.pdb.files.txt C#转储 dia2dump -f Autofac.pdb> Autofac.pdb.files.txt dia2dump -all Autofac.pdb> Autofac.pdb.all.txt 在“全部”转储中是否有我遗漏的东西? 它必须使用校验和。 如果我在Module.cs中更改单个字符,我会得到: 在哪里可以找到.pdb中引用的源文件的校验和?

通过提供类名作为字符串来获取引用程序集的类型?

这些是类似的问题: 操作方法:在运行时使用Silverlight中的字符串从引用的程序集加载类型,引用的程序 集中的类上的GetType失败,但两个答案都不起作用。 我有一个MVC项目,它从包含普通类型作为字符串的数据库中提取数据。 这些类型位于引用的程序集中,而不是MVC项目中。 例如,假设我的Referenced程序集名称是MyFramework ,普通类型名称为Car ,完整类型名称可以是MyFramework.Cars.Car或MyFramework.Vehicles.Cars.Car或其他一些变体。 我只有引用的程序集名称和普通的类名称作为字符串。 无论完整的类型名称如何,我如何获得类型? 最后,我可以在引用的程序集中编写一个函数来调用GetType()并在MvC项目中使用它,这样我可以放弃包括程序集名称吗? 我想删除已知的程序集名称,所以我想我可以在引用的程序集中编写一个Util,如: namespace MyFramework //the referenced assembly { public static class TypeUtil { public static Type GetFrameworkType(string typeName) { return Type.GetType(typeName); } } } 然后在我的MVC项目中,我可以调用它而不需要将程序集作为字符串名称。 这是可能的还是我总是需要汇编名称?

如何在运行,加载和使用中编译C#DLL

A)动态编译C#EXE和DLL是相对容易的。 B)执行EXE意味着运行新的应用程序。 加载DLL意味着可以在可以在应用程序或项目之间共享的情况下使用方法和函数。 现在,可以从MSDN或为方便起见,找到编译EXE(或使用温和修改,DLL)的最快最简单的方法: private bool CompileCSharpCode(string script) { lvErrors.Items.Clear(); try { CSharpCodeProvider provider = new CSharpCodeProvider(); // Build the parameters for source compilation. CompilerParameters cp = new CompilerParameters { GenerateInMemory = false, GenerateExecutable = false, // True = EXE, False = DLL IncludeDebugInformation = true, OutputAssembly = “eventHandler.dll”, // Compilation name }; // Add […]

如果语句似乎正在评估,即使条件评估为false

昨晚工作到很晚,我们试图弄清楚为什么会出现问题。 如果不应该进行validation检查失败。 我们最终在这段代码中添加了一个print语句(从Reflector中反汇编,以便检查代码实际上是我们编写的代码): public static string Redacted(string name, DateTime lastModified) { long ticks = lastModified.Ticks; if ((ticks != (ticks – (ticks % 10000L))) && (lastModified != DateTime.MaxValue)) { Log.Debug(string.Format(“Last Modified Date = ‘{0}’. Ticks = ‘{1}’. TicksCalc = ‘{2}'”, lastModified.ToString(“dd/MM/yyyy hh:mm:ss.fff”), ticks, ticks – (ticks % 10000L))); 它打印(重新格式化): Last Modified Date = ’22/03/2011 12:16:22.000’. Ticks […]

什么是.NET程序集中的Fusion

在Suzanne Cook的博客中有这样的描述: LoadFrom上下文:通常,如果用户为Fusion提供了一个用于查找程序集的路径(并且在Load上下文中找不到该路径上的程序集),那么它就在LoadFrom上下文中。 按路径加载有多种方法:LoadFrom(),CreateInstanceFrom(),ExecuteAssembly(),使用代码库通过interop加载程序集等。 我还发现了一篇关于它的MSDN文章,但我不确定Fusion Suzanne谈论的内容是否与此处相同: http : //msdn.microsoft.com/en-us/library/e74a18c4(v = vs.71) .aspx但它似乎是一个Log查看器,所以我理解Suzanne所说的是什么 Fusion是一种探测机制,它采用路径等,它探测Application Base, codeBase ,GAC等中的程序集,将它们加载到上下文中。 有人可以澄清一下吗?

可以调用Assembly.Load(byte )来引发AppDomain.AssemblyResolve事件吗?

假设我有一个AppDomain.AssemblyResolve事件的处理程序,并在处理程序中我构造一个字节数组并调用方法Assembly.Load(byte[]) 。 此方法本身是否会导致再次引发AssemblyResolve事件,并导致我的处理程序重新进入? 我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码。 我做了一些实验,发现时没有发现任何情况。 我试图加载需要额外引用的程序集,试图将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor方法)加载程序集。 在任何情况下,我都没有观察到AssemblyResolve事件是从Assembly.Load(byte[])方法内部引发的,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生。 但我可能会在这里遗漏一些东西。

手动加载从属程序集

我有一个项目,使用Assembly.Load或Assembly.LoadFile加载同一程序集的多个版本。 然后,我使用Assembly.CreateInstance从该特定程序集创建一个类型。 这很有效,直到我创建的类型引用另一个依赖程序集。 我需要一种方法来拦截这个特定程序集的请求,以加载另一个程序集并为其提供正确的版本(或更好的探测路径)以查找其依赖项。 这是必需的,因为我使用Assembly.CreateInstance创建的程序集的v1和v2通常也需要不同版本的依赖程序集,但默认情况下,v1和v2都将探测相同的目录。 我已经看到了如何一般地为AppDomain做的示例 ,但是我需要以处理来自特定根程序集的所有分辨率的方式执行此操作。 假设我做了类似的事情: AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args) { //Use args.RequestingAssembly to determine if this is v1 or v2 based on path or whatever //Load correct dependent assembly for args.RequestinAssembly Console.WriteLine(args.Name); return null; }; 这可能适用于我的目标程序集立即引用的依赖项,但这些依赖项引用的程序集又如何呢? 如果v1引用了Depv1,它本身引用了DepDepv1,我需要能够知道这一点,所以我可以确保它可以正确地找到它们。 在那种情况下,我想我需要以某种方式跟踪这个。 也许通过添加自定义程序集证据 – 虽然我无法使其工作,并且似乎没有任何“程序集元数据”属性,我可以在运行时添加。 如果我可以简单地指示特定程序集从特定目录加载其所有依赖项,那将会容易得多。 更新 我设法使用AssemblyResolve事件根据RequestingAssembly的路径加载依赖程序集,但它似乎是一个有缺陷的方法。 似乎使用哪个依赖程序集版本完全取决于首先加载哪个版本。 例如: 加载v1 加载v2 参考v1导致Depv1的加载 参考v2导致Depv2的加载 […]

无法加载文件或程序集System.Web.WebPages.Deployment

我正在开发系统网页,突然出现这个错误: Could not load file or assembly ‘System.Web.WebPages.Deployment, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The system cannot find the file specified. 我已经validation了我的xml文件配置,一切都很好看。 这是堆栈跟踪: [FileNotFoundException: Could not load file or assembly ‘System.Web.WebPages.Deployment, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The system cannot find the file specified.] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly […]

无法加载文件或程序集’Oracle.DataAccess错误

我用C#构建ASP.NET应用程序,我想连接到oracle数据库。 我在我的64位Microsoft Window Server 2008计算机上的应用程序中添加了对Oracle.DataAccess引用。 我还在我的机器上安装了ODAC(Oracle数据访问组件),并且此路径上也存在Oracle.DataAccess.dll C:\ WINDOWS \ Microsoft.NET \assembly\ GAC_64 \ Oracle.DataAccess 但当我试图连接我遇到以下错误: 无法加载文件或程序集“Oracle.DataAccess,Version = 4.112.3.0,Culture = neutral,PublicKeyToken = 89b483f429c47342”或其依赖项之一。 该系统找不到指定的文件。