如何确定我的.NET桌面应用程序已加载的所有程序集?我想将它们放在about box中,这样我就可以通过电话查询客户,以确定他们在PC上有什么版本的XYZ.
很高兴看到托管和非托管程序集.我意识到列表会变长,但我打算对它进行增量搜索.
通常,当您添加新程序集时,您必须进入Visual Studio并添加引用(.dll存储在/ bin目录中).
由于本网站即时编译,我是否可以将.dll添加到实时网站,然后在.aspx页面中使用.dll?
目前在Visual Studio中,除非我去"添加引用",否则我看不到.dll.
在尝试将Debug安装集安装到测试计算机时,我今天第一次遇到了并排程序集.我最终管理了它,但留下了几个问题:
我在这个应用程序中使用C#.
我有一个DLL包含在我的应用程序中.从这个DLL,我需要找到包含此DLL的主程序的汇编版本.
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()不回报我想要的东西.这将返回DLL的Assembly版本,而不是主程序.
如何从主程序中获取版本信息?
我使用xml文件作为嵌入式资源来加载XDocument.我们使用以下代码从程序集中获取相应的文件:
XDocument xd = new XDocument();
Assembly assembly = null;
try
{
assembly = Assembly.GetExecutingAssembly();
}
catch(Exception ex)
{
//Write exception to server event log
}
try
{
if(assembly != null)
{
using(StreamReader sr = new
StreamReader(assembly.GetManifestResourceStream("assemblyPath")))
{
using(XmlTextReader xtr = new XmlTextReader(sr))
{
xd = XDocument.Load(xtr);
}
}
}
}
catch(Exception ex)
{
//Write exception to server event log
}
Run Code Online (Sandbox Code Playgroud)
因此,当部署代码时,我们偶尔会转到页面,并且不会从嵌入的文档中加载任何内容.当我们检查事件日志时,没有错误.如果用户只是刷新页面,它将加载正常.这让我认为,由于某种原因,assembly = Assembly.GetExecutingAssembly();偶尔会返回null,并且编写代码的方式不是错误.所以,我的问题是为什么会Assembly.GetExecutingAssembly();返回null?我发现有几篇文章谈到有时会出现非托管代码的错误,但是这个应用程序是用C#编写的,并通过安装项目进行部署.
代码最初是在没有错误避免代码的情况下编写的.添加它是为了防止用户获得错误屏幕.异常将写入服务器的事件日志.
我正在使用一个自定义框架,它使用反射来GetTypeByName(string fullName)对从数据库获取的完全限定类型名称进行操作,以创建所述类型的实例并将其添加到页面中,从而产生标准的模块化类型.
GetTypeByName是我的一个实用函数,只需迭代Thread.GetDomain().GetAssemblies(),然后执行一个assembly.GetType(fullName)查找相关类型.显然,这个结果会被缓存以供将来参考和使用.
但是,我遇到了一些问题,如果web.config得到更新(并且在一些更可怕的实例中,如果应用程序池被回收)那么它将失去对某些程序集的所有知识,导致无法呈现模块类型.调试显示当前线程程序集列表中不存在缺少的程序集.
为了解决这个问题,我添加了第二个检查,它有点脏,但通过/ bin /目录的DLL进行递归并检查程序集列表中是否存在每个检查.如果没有,则使用Assembly.Load加载它并通过"解决程序集加载上下文问题"修复上下文问题.
这可行,只是看起来(并且我知道这不可能)一些项目仍然可以访问缺少的程序集,例如我的实际Web项目而不是框架本身 - 然后它会抱怨重复的引用已被添加!
有没有人听说过这样的事情,或者有任何想法为什么一个程序集在配置更改时根本不存在?没有一个解决方案,最优雅的解决方法是让bin中的所有程序集重新加载?它需要全部在一个"点击",以便网站访问者除了一个小延迟之外看不到任何差异,因此app_offline.htm文件是不可能的.以编程方式重命名bin中的DLL然后将其命名回来确实有效,但需要IIS用户帐户的"修改"权限,这是疯狂的.
感谢社区可以收集的任何指示!
我的Windows服务需要从Windows防火墙创建/删除某些规则.对于这一点,我界面NetFwTypeLib中<windows>\system32\hnetcfg.dll通过COM.它在我的64位Windows 7计算机上运行良好,但在另一台64位Windows 7计算机上进行测试会引发以下错误:
Service cannot be started. System.IO.FileNotFoundException:
Could not load file or assembly 'Interop.NetFwTypeLib,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null' or one of its dependencies.
The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,如果我使用我的应用程序嵌入并安装程序集,我会遇到不同版本的Windows以及32位和64位之间的问题.
如何解决这个缺少的装配部署问题?
编辑:这似乎是除了4.0之外的任何目标框架的VS2010问题.有人有解决方法吗?
c# deployment assemblies windows-firewall filenotfoundexception
我正在进行运行时程序集加载,但我不知道任何类或方法的名称.我不想用我们声明的方法列出我的程序集中的所有类,而不是从System.Object继承的那些类.
这是代码:
string str = "";
Assembly assembly = Assembly.LoadFile(@"c:\components.dll");
foreach (Type type in assembly.GetTypes())
{
if (type.IsClass == true)
{
str += type.Name + "\n";
MethodInfo[] methodInfo = type.GetMethods(BindingFlags.DeclaredOnly);
foreach (MethodInfo mi in methodInfo)
{
str += "\t" + mi.Name + "\n";
}
}
}
MessageBox.Show(str);
Run Code Online (Sandbox Code Playgroud)
这是components.dll:
public class component01
{
public string myName = "component01";
public string getMyName()
{
return myName;
}
}
public class component02
{
public string myName = "component02";
public string getMyName()
{
return myName; …Run Code Online (Sandbox Code Playgroud) 我有一个包含多个c#类库的ac#解决方案.我最近正在做一些研究,建议我的库中输出的程序集应该签名,并使用强名称签名.首先,我想知道我是否最好进步?从这些类库输出的库用于多个其他项目.
如果从我之前的问题建议我是的,我应该签署我的dll,我使用的.snk,这可以用于解决方案中的每个类库吗?或者每个类库必须是一键吗?
我开始在一个新项目中工作,在一个解决方案中有许多组件.我还不熟悉程序集依赖性,并且很难确定哪个程序集依赖于另一个程序集.
您是否知道任何能够显示依赖关系列表或更好的可视化图表的工具?
任何帮助赞赏!
assemblies ×10
.net ×5
c# ×5
dll ×2
reflection ×2
asp.net ×1
deployment ×1
load ×1
side-by-side ×1
strongname ×1
version ×1
winforms ×1