如何为.Net程序集创建自定义属性,然后在Windows资源管理器的"详细信息"选项卡下可以看到该属性?
与"文件描述","类型","产品版本"等等并行的东西
更新:引用我对Lars的评论......"虽然我希望从Visual Studio中做到这一点,但这当然不是我的首要任务.实际上我希望将任何解决方案集成到现有的nant构建过程中.因此影响组件后编译是完全可以接受的.你有没有听说过这样的工具?"
进一步更新:我不确定我所谈论的是否是属性,在以下属性页的条目中澄清我想要创建的内容......

每当我构建我的Web解决方案时,我都会收到此错误
Could not load file or assembly 'dotless.Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=96b446c9e63eae34' or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))
Run Code Online (Sandbox Code Playgroud)
我在Windows 7上安装了带有.NET 4.0的VS 2010.
dll位于Web应用程序的Bin文件夹内.
有什么建议?
谢谢.
我尝试在C#中将程序集加载到我的源代码中.所以我首先编译源文件:
private bool testAssemblies(String sourceName)
{
FileInfo sourceFile = new FileInfo(sourceName);
CodeDomProvider provider = null;
bool compileOk = false;
// Select the code provider based on the input file extension.
if (sourceFile.Extension.ToUpper(CultureInfo.InvariantCulture) == ".CS")
{
provider = CodeDomProvider.CreateProvider("CSharp");
}
else if (sourceFile.Extension.ToUpper(CultureInfo.InvariantCulture) == ".VB")
{
provider = CodeDomProvider.CreateProvider("VisualBasic");
}
else
{
Console.WriteLine("Source file must have a .cs or .vb extension");
}
if (provider != null)
{
// Format the executable file name.
// Build the output assembly path using the …Run Code Online (Sandbox Code Playgroud) 我正在按照2006年Microsoft .Net课程练习册的说明进行其中一个练习.(具体来说,本课程是MS2349B,我正在进行第4单元练习2).这些练习似乎是为Vista之前的每个人都拥有完全管理员权限而构建的.(我正在使用.net 4.0.)
此练习涉及构建强名称程序集,将其安装在GAC中,针对强名称程序集构建本地可执行文件,验证可执行文件是否运行.
根据教程,我使用#if 块来签署我的程序集:
#if STRONG
[assembly: System.Reflection.AssemblyVersion("2.0.0.0")]
[assembly: System.Reflection.AssemblyKeyFile("OrgVerKey.snk")]
#endif
Run Code Online (Sandbox Code Playgroud)
我以本地用户身份构建可执行文件:
C:\path\to\lab>csc /define:STRONG /target:library
/out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs
C:\path\to\lab>csc /reference:MyStringer\Stringer.dll
/reference:AReverser_v2.0.0.0\AReverser.dll Client.cs
Run Code Online (Sandbox Code Playgroud)
我通过以管理员身份运行的visual studio命令提示符将其安装到GAC中:
C:\path\to\lab>gacutil /i AReverser_v2.0.0.0\AReverser.dll
Run Code Online (Sandbox Code Playgroud)
当我在管理员提示符下运行我的exe时,我得到了我期望的输出 - 应用程序运行正常并且似乎正确地从gac加载dll.当我在非管理命令提示符下运行时,我收到以下错误
Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b5fcbdcff229fabb'
or one of its dependencies. The located assembly's manifest definition does not
match the assembly reference. (Exception from HRESULT: 0x80131040)
at MainApp.Main()
Run Code Online (Sandbox Code Playgroud)
对我来说奇怪的是publicKeyToken与GAC中的内容不同:
AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66
Run Code Online (Sandbox Code Playgroud)
但是,如果我从GAC卸载AReverser并尝试运行我的exe作为管理员提示我收到以下错误,表明它正在寻找预期的公钥令牌f0548c0027634b66:
C:\path\to\lab>gacutil /u "AReverser,Version=2.0.0.0,Culture=neutral,
PublicKeyToken=f0548c0027634b66"
Microsoft (R) …Run Code Online (Sandbox Code Playgroud) 我一直在阅读使用C#3.0的CLR,我一直在思考Assemblies,Modules和Headers,但事情变得复杂了.这就是我所理解的,但如果有人能够澄清一些事情,那将会很棒:
模块是包含IL代码和元数据表的csc.exe的结果.元数据表包含三个不同的表:
程序集是包含许多模块以及图像,文档,pdf等资源的容器.
书中说大会是一个由模块组成的容器,它也说管理模块是
管理模块:
托管模块是标准的32位Microsoft Windows可移植可执行文件(PE32)文件或标准的64位Windows可移植可执行文件(PE32 +)文件,需要CLR才能执行.
里希特,杰弗里(2010-02-05).CLR通过C#(Kindle Locations 696-697).OReilly Media - A. Kindle版.
大会的定义:
程序集是一个或多个模块或资源文件的逻辑分组.
里希特,杰弗里(2010-02-05).CLR通过C#(Kindle Locations 766-767).OReilly Media - A. Kindle版.

因此,管理模块似乎实际上是从同一本书中拍摄的图像中的大会的一部分.
PE32标题属于Assemblies,但是作者也说它也属于Managed Modules,等等.
这里的分离是什么?他为什么使用模块和组件可以互换,即使它们看起来足够独立.
托管PE文件有四个主要部分:PE32(+)头,CLR头,元数据和IL.PE32(+)标头是Windows期望的标准信息.CLR头是一小块信息,特定于需要CLR(托管模块)的模块.
里希特,杰弗里(2010-02-05).CLR通过C#(Kindle Locations 1628-1629).OReilly Media - A. Kindle版.
此外,图像清楚地显示模块只有元数据而不是PE32(+),CLR标题等.您认为Manifest和Metadata可以互换使用吗?
还有,请你解释一下模块中的清单表吗?
我已经阅读了几篇关于编写和编译动态C#代码的帖子.例如,这篇文章.我知道它可以通过几种方式完成.
但是,调用代码调用程序很慢.我做了一个简单的基准测试,它比调用本机方法慢了约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 FooClass { public static int Execute(int i) { return i * 2; }}"
);
var type = res.CompiledAssembly.GetType("FooClass");
var obj = Activator.CreateInstance(type);
var method = type.GetMethod("Execute");
int i = 0, t1 …Run Code Online (Sandbox Code Playgroud) 如何确定我的.NET桌面应用程序已加载的所有程序集?我想将它们放在about box中,这样我就可以通过电话查询客户,以确定他们在PC上有什么版本的XYZ.
很高兴看到托管和非托管程序集.我意识到列表会变长,但我打算对它进行增量搜索.
我试图编写一些代码,允许我动态地将DLL加载到我的应用程序中,具体取决于应用程序设置.我们的想法是在应用程序设置中设置要访问的数据库,然后加载相应的DLL并将其分配给我的应用程序访问的接口实例.
这是我目前的代码:
Dim SQLDataSource As ICRDataLayer
Dim ass As Assembly = Assembly. _
LoadFrom("M:\MyProgs\WebService\DynamicAssemblyLoading\SQLServer\bin\Debug\SQLServer.dll")
Dim obj As Object = ass.CreateInstance(GetType(ICRDataLayer).ToString, True)
SQLDataSource = DirectCast(obj, ICRDataLayer)
MsgBox(SQLDataSource.ModuleName & vbNewLine & SQLDataSource.ModuleDescription)
Run Code Online (Sandbox Code Playgroud)
我有我的接口(ICRDataLayer),SQLServer.dll包含此接口的实现.我只想加载程序集并将其分配给SQLDataSource对象.
上面的代码不起作用.抛出没有异常,甚至没有出现Msgbox.我希望至少消息框中没有任何内容,但即使这样也不会发生!
有没有办法确定加载的程序集是否实现了特定的接口.我尝试了以下,但这似乎也没有做任何事情!
For Each loadedType As Type In ass.GetTypes
If GetType(ICRDataLayer).IsAssignableFrom(loadedType) Then
Dim obj1 As Object = ass.CreateInstance(GetType(ICRDataLayer).ToString, True)
SQLDataSource = DirectCast(obj1, ICRDataLayer)
End If
Next
Run Code Online (Sandbox Code Playgroud)
编辑:Vlad的例子中的新代码:
Module CRDataLayerFactory
Sub New()
End Sub
' class name is a contract,
' should be the same for all plugins
Private Function …Run Code Online (Sandbox Code Playgroud) 我使用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用户帐户的"修改"权限,这是疯狂的.
感谢社区可以收集的任何指示!
assemblies ×10
.net ×5
c# ×5
asp.net ×2
dll ×2
reflection ×2
attributes ×1
clr ×1
dynamic ×1
gac ×1
vb.net ×1
winforms ×1