Tag: 程序集

如何使用自定义属性动态计算所有方法

我有一个简单的挑战。 我动态地需要弄清楚C#中具有特定属性的所有方法。 我将从另一个应用程序动态加载程序集,需要找出确切的方法。 组件如下所示: Base.dll: Class Base { [testmethod] public void method1() … } Derived.dll: Class Derived:Base { [testmethod] public void method2() } 现在在第3个应用程序中,我动态地想加载上面提到的dll并找出testmethods。 如果我加载Base.dll,我需要获得testmethod1。 如果我加载Drived.dll,我应该得到testmethod1和testmethod2。 我在网上找到了一些帮助我动态加载dll的代码: List a = new List(); string bin = @”Bin-Folder”; DirectoryInfo oDirectoryInfo = new DirectoryInfo(bin); //Check the directory exists if (oDirectoryInfo.Exists) { //Foreach Assembly with dll as the extension […]

由于格式不正确,加载程序集失败

我在一个非常大的Windows窗体.net(C#)应用程序上开发了几个程序集。 最初每个组件都是为Target Platfom“Any CPU”构建的。 由于x64机器上的Crystal Reports存在问题,我们必须为x86目标平台构建整个项目。 我重新开始为x86重建一些项目,它运行得很好。 但有一个我有问题,当我尝试在另一个程序集中使用它作为参考时,另一个不会加载它给出以下错误: 无法加载文件或程序集#MyAssembly#或其依赖项之一。 尝试加载格式不正确的程序。 在具有多个程序集的示例项目中使用Crystal进行游戏时,我发现当为不同的目标平台构建项目时会发生此错误。 但这不是这种情况。 我为X86构建了每个Project,并且无法弄清楚问题出在哪里。

在程序启动后复制DLL时,在运行时加载程序集失败

在运行时我加载一个程序集 Assembly assembly = Assembly.LoadFrom(@”c:\MyFolder\MyAssembly.dll”); 如果程序集位于该文件夹中,则此方法有效。 如果程序集不在文件夹中,我会得到一个例外,当然告诉我无法找到程序集或其中一个依赖项。 我正在捕获exception并向用户显示错误消息。 该程序继续运行。 如果我现在将缺少的程序集复制到文件夹“c:\ MyFolder”,同时程序仍在运行并再次触发执行上述行的函数, 我得到相同的exception – 一个System.IO.FileNotFoundException – 再次表示程序集可以虽然DLL现在在文件夹中,但是找不到 。 如果我重新启动应用程序它可以工作,并找到程序集。 如果我在应用程序启动后第一次尝试加载程序集之前启动应用程序并将DLL复制到该文件夹​​,它也可以工作。 所以问题似乎与Assembly.LoadFrom的第一次失败调用有关。 这种行为可能是什么原因,我该怎么做才能解决问题? 提前谢谢你的帮助! 编辑:还有一个细节: 我添加了一个File.Exists测试: string filename = @”c:\MyFolder\MyAssembly.dll”; bool test = File.Exists(filename); Assembly assembly = Assembly.LoadFrom(filename); test返回true但Assembly.LoadFrom抛出FileNotFoundException 。

如何引用多版本程序集

我正在开发一个Sharepoint应用程序并使用.NET AjaxControlToolkit库,我们正在向Sharepoint添加一个自定义的aspx页面。 Sharepoint 2007以怪癖模式运行,因此我对AJAX库进行了一些修改,使其表现得像通常那样。 问题是,另一个团队已经使用了AJAX库,它与我的版本不同。 这会导致冲突,因为bin文件夹中只能有一个具有相同名称的dll。 据我所知,.NET应该能够轻松处理这种情况。 我尝试使用强名称和GAC来解决它,但它仍然引用bin文件夹中的dll。 如果bin文件夹中没有AjaxControlToolkit.dll,则应用程序将无法加载程序集。 如果我在我这样使用完整的assembly信息 它给了我编译器错误CS0433 有人可以帮助我如何在应用程序中使用多个版本的程序集?

使用全局程序集缓存(GAC) – 以其设计的方式

以下解决方案是否是在代码中使用GAC库的唯一可能性? Assembly lib = Assembly.Load(“MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31f5625abd53197f”); Console.WriteLine(lib.GetType(“MyClass”).GetMethod(“Start”).Invoke(obj, null)); 我有点困惑 – 我已经阅读了很多关于GAC的内容,我知道如何在GAC中签署程序集,安装和卸载程序集,但不知道如何使用它,以及它如何帮助程序员(除了它安全地存储相同库的不同版本)。 我希望我能正常创建类,而不是被迫调用上面提到的方法。 我不想要任何解决方法,例如:“更改Windows注册表”,因为我不认为GAC是为这种操作而设计的。 我想要一个简单的答案:GAC的用途是什么,运行时环境是否以某种方式使用它? 当代码变得非常丑陋且难以管理时,使用GAC的重点是什么? 或许我错过了什么? 也许我应该手动将程序集复制到我的本地文件夹中? 但我听说这也很难。

如何修补.NET程序集?

如果我两次编译一个C#项目,我会得到两个程序集。 这些程序集不完全相同(使用二进制差异)。 我可以想到为什么会这样,但事实仍然是两个组件的来源是相同的。 我担心在这些程序集之间创建补丁,并在客户机器上应用补丁。 有谁知道我可以创建和应用补丁的库(最好是.NET)或工具? 理想情况下,它还应该处理小的更改,例如更改项目级别的依赖项或调整源代码中的几行。 它不必能够处理更大的更改,因为我很乐意在这种情况下完全替换程序集。 更新 : 我认为更多的背景可能有助于澄清我所得到的。 我有一个持续集成服务器构建我的应用程序。 我更改文件和程序集版本以反映我正在构建的内部版本号和版本。 我可以用不同的方式完成它,但这是我喜欢的选项。 这会导致在构建应用程序时更改程序集引用,但我很满意。 我现在关注的是将更新分发给以前发布的版本。 我使用InstallShield构建更新。 InstallShield可用的程序集简化为小补丁。 这些不会大幅增加更新的大小。 我的应用程序有一些数据文件,基本上是包含程序集的加密存档。 InstallShield无权访问这些程序集或了解我的存档。 它不知道如何解密和提取它。 我编写了自己的补丁例程,它在先前的存档中找到已更改的文件,并用新的更新版本替换它们。 基本上是搜索和替换策略。 一个存档包含近百个(并且正在增长)这些程序集,其中一些程序集包含大型数据文件作为资源。 这些程序集依赖于作为应用程序一部分的程序集。 它们也在持续集成构建期间编译。 在构建期间不编译它们将留下依赖性问题的空间,我不愿意尝试管理它。 每次创建补丁时,都会包含所有这些程序集。 我现在正在寻找通过为这些程序集生成补丁来减少补丁大小的选项。

在调用程序集中的任何方法之前,CLR调用的最早入口点是什么?

在过去的几年里,我偶尔会想知道.NET世界中有哪些(in)着名的DLL_PROCESS_ATTACH可用。 我所说的任何文档,略微简化,类的最早入口点是静态构造函数(cctor),但是你不能影响它何时被调用 ,也不能定义一个保证在任何其他cctor之前被调用的cctor。或字段初始化程序,黑客,如果从未使用过类,它甚至可能根本不会被调用。 因此,如果您想要在调用程序集的任何方法之前保证已初始化某些内容,并且您不希望为程序集中的每个类添加一个cctor,您可以采取什么方法? 或者,这些年来我是否有一个简单易用的托管解决方案?

以编程方式添加Project引用

基本上,在阅读了几个链接后,我尝试了上面的代码: foreach (EnvDTE.Project proj in soln.Projects) { if (proj.Name == “BLL”) { VSLangProj.VSProject vsproj = (VSLangProj.VSProject)proj.Object; vsproj.References.Add(@”C:\Teste\DAL\bin\Debug\DAL.dll”); } } 所有路径,项目名称都在purpouse上进行了硬编码,因为我仍在测试如何实现它。 虽然它会像我做项目文件夹 – >引用 – >添加引用 – >选择一个,手动(编译时) 但在加载解决方案后,BLL项目没有包含对DAL项目的任何PERMANENT引用。

C# – 将.NET程序集加载到单独的AppDomain中,以便卸载它

可能重复: 将DLL加载到单独的AppDomain中 将.NET程序集加载到单独的AppDomain中的正确方法是什么,这样您就可以访问其类型/类,但仍然可以卸载它(并重新加载它)。 这是前面讨论的切线: C# – 正确加载程序集,查找类和调用Run()方法

无法在C#控制台应用程序中使用外部引用

我已经尝试了下面的所有建议但仍然没有快乐。 我现在正在尝试一个控制台应用程序,让我解释一下我正在做什么。 我在VS 2010中创建了一个新的控制台项目 我添加了一些不属于我的引用(dll),例如Castle.Winsor和N2 CMS dll 在控制台应用程序中,我可以添加使用语句指示我在引用的DLL中使用名称空间 我开始编写代码。 一旦我编译了所有使用引用的DLL的代码立即抱怨“找不到类型或命名空间名称’(你是否缺少using指令或程序集引用?)” 我已经尝试将dll设置为始终复制到本地,我已将DLL复制到同一目录中,我尝试通过项目添加引用并添加对DLL本身的引用 我不会在Web应用程序项目或ASP.net项目中遇到这个问题,它们总能正常工作,只能编译为EXE,如控制台应用程序或Windows服务。 必须有一些我想念的东西,否则我现在就会有这个工作。