列出所有可用的.NET 2.0程序集的最佳方法是什么?
所需列表的一个示例是当您在.NET选项卡中执行"添加引用..."时,MS Visual Studio会显示一个.
我读过Visual Studio使用自己的目录配置和GAC另一个和.NET安装另一个.有关如何以计算机可移植方式知道此目录的位置的任何想法(例如,另一台计算机可能在D:驱动器中安装了Windows)?
从列出的信息来看,它必须是Assembly.Loadxxxx()它.
注意:它应该以编程方式完成,而不是使用gacutil(例如,除非它提供了C#API).所有这一切的目的是创建一个自定义动态脚本编辑器,以便您了解获取此信息的必要性.
经过大量的试验和错误(主要是由于缺少文档和示例),我设法创建了MSI安装程序,将自定义DLL作为并行程序集安装到WinSxS.只有一个问题:卸载会将所有文件(DLL,清单和目录)保留在WinSxS目录中.怎么能或者我应该最好地清理它?我确信没有别的东西可以引用它.
我已经读过某个地方,WinSxS有一个自我清理过程,随着时间的推移清理,但我无法找到更多相关信息.你可以手动调用它来清理东西吗?
我看到的唯一另一种方法是手动删除这些位.首先,您必须将所有文件(程序集,目录,清单及其各自的目录)的所有者从SYSTEM更改为管理员帐户,调整权限并将其删除.注册表中还有一些部分(我认为HKLM\COMPONENTS\DerivedData\Components可能是一个地方),但由于WinSxS应该被视为不透明,因此很难找到任何信息.
实际上我试图在我的解决方案中实现某种"静态链接"程序集.所以我尝试了以下内容:
private MyObject temp = new MyObject();在这些步骤之后,我按预期得到了FileNotFoundException.因此,让我们尝试使用此快速入侵在AssemblyResolveEvent中加载程序集
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
{
Assembly MyAssembly = AppDomain.CurrentDomain.Load(Properties.Resources.ExternalAssembly);
return MyAssembly;
};
Run Code Online (Sandbox Code Playgroud)
这样可行!我可以从AssemblyResolveEvent中的资源文件加载我的程序集.但是这个事件只会发生,如果它无法在其他任何地方找到我的组件.但是我怎么能在 .Net尝试搜索不同的地方之前加载我的程序集?
由于检查先前引用的程序集的事实,我认为可以预先将程序集加载到域中,这将被采用.
我在program.cs中使用以下Main()方法尝试了这个
static void Main()
{
LoadMyAssemblies();
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadMyAssemblies();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static Assembly LoadMyAssemblies()
{
Assembly result = AppDomain.CurrentDomain.Load(Properties.Resources.MyStaticAssembly);
return result;
}
Run Code Online (Sandbox Code Playgroud)
但它仍会运行到ResolveEventHandler中.更好的是,如果我再次加载程序集并查看AppDomain.CurrentDomain.GetAssemblies()我可以看到我的程序集加载了两次!!
所以任何想法为什么加载程序集在AssemblyResolve事件之前加载时不会被考虑在内?在调试器的帮助下,当调用来自AssemblyResolve时,我也返回了null,但是在这种情况下,我在开头时得到了一个FileNotFoundException.
我们有一个应用程序,其编译时的结构如下所示:
是否可以在此使用ILMerge?你会怎么做?
resources ilmerge assemblies localization satellite-assembly
class Foo { }
class Foo1 : Foo { }
class Foo2 : Foo { }
Run Code Online (Sandbox Code Playgroud)
我怎样才能将所有使用Foo的类作为基类?在同一程序集中不需要继承的类.
包含托管代码和非托管代码混合的.NET程序集不能与其他程序集进行ILMerged.
如何验证给定的.NET程序集是包含纯托管代码,还是托管代码和非托管代码的混合?
这是设置:
纯粹的DotNET类库由非托管桌面应用程序加载.类库充当插件.这个插件加载了自己的小插件(所有DotNET类库),它通过将dll作为字节流读入内存来实现,然后
Assembly asm = Assembly.Load(COFF_Image);
Run Code Online (Sandbox Code Playgroud)
当那些小宝贝插件引用其他dll时会出现问题.由于它们是通过内存而不是直接从磁盘加载的,因此框架通常无法找到这些引用的程序集,因此无法加载它们.
我可以在我的项目中添加一个AssemblyResolver处理程序,我可以看到这些引用的程序集已经过去了.我对在磁盘上找到这些引用程序集的位置有一个相当好的想法,但是如何确保Assmebly I load是正确的?
简而言之,我如何可靠地从System.ResolveEventArgs.Name字段转到dll文件路径,假设我有一个这个dll可能隐藏的所有文件夹的列表?
我有一个问题,我需要能够有一个编译的exe(.net 3.5 c#),我将复制分发,例如在发送exe之前需要更改密钥.
每次需要新的exe时我都无法编译.这是一个瘦客户端,将用作注册过程的一部分.
是否可以向具有空值的资源文件添加条目,然后当请求进入时,另一个应用程序获取空白的默认瘦客户端,复制它,用所需数据填充空白值.
如果有,怎么样?如果没有,你有什么想法吗?我现在已经摸不着头几天了,这个限制是由于我需要工作的边界.
我的另一个想法是将值注入一个方法,我不知道我怎么会尝试这个.
谢谢.
我的程序集中有很多入口点,我希望在运行此程序集中的任何其他代码之前,每个AppDomain执行一次初始化代码.最好的方法是什么?
我看到的一个解决方案是拥有一个带有静态构造函数的类,并继承我拥有的每个入口点.像这样的东西:
public class Initializer
{
static Initializer()
{
EnsureInitialized(); // Calls initialization code once and only once
}
}
public class EntryPointOne : Initializer, IEntryPoint
{
// Some code here
}
public class EntryPointTwo : Initializer, IEntryPoint
{
// Some code here
}
// etc.
Run Code Online (Sandbox Code Playgroud)
这让我可以避免在每个入口点编写样板静态构造函数,但是没有多继承,这并不总是可行的.你能想到其他更好的选择吗?
我有一个包含数千个文件的文件夹(可能带有嵌套的子文件夹),其中一些是DLL,其中一些是.NET程序集.我需要找到包含与特定模式匹配的类型/成员的所有程序集(例如"*Collection",或"Create*").最好(最快)的方法是什么?
建议开源库是可以的,只要它们的使用不需要打开我的源代码.
assemblies ×10
c# ×6
.net ×3
reflection ×2
.net-3.5 ×1
clr ×1
disassembly ×1
executable ×1
ilmerge ×1
inheritance ×1
legacy ×1
localization ×1
native ×1
resources ×1
static ×1
uninstall ×1
unmanaged ×1
winsxs ×1
wix ×1