标签: assemblies

如何为程序集创建自定义属性?

如何为.Net程序集创建自定义属性,然后在Windows资源管理器的"详细信息"选项卡下可以看到该属性?

与"文件描述","类型","产品版本"等等并行的东西

更新:引用我对Lars的评论......"虽然我希望从Visual Studio中做到这一点,但这当然不是我的首要任务.实际上我希望将任何解决方案集成到现有的nant构建过程中.因此影响组件后编译是完全可以接受的.你有没有听说过这样的工具?"

进一步更新:我不确定我所谈论的是否是属性,在以下属性页的条目中澄清我想要创建的内容......

替代文字

.net attributes assemblies

9
推荐指数
1
解决办法
2226
查看次数

无法加载程序集.NET 4.0

每当我构建我的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文件夹内.

有什么建议?

谢谢.

asp.net assemblies

9
推荐指数
2
解决办法
9922
查看次数

装载组件无法正常工作

我尝试在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)

.net c# assemblies

9
推荐指数
1
解决办法
9961
查看次数

在探测程序集时,为什么在以管理员身份和普通用户身份运行时搜索到的publicKeyToken会有所不同?

我正在按照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)

.net c# assemblies gac

9
推荐指数
1
解决办法
622
查看次数

CLR中的模块,程序集,标头

我一直在阅读使用C#3.0的CLR,我一直在思考Assemblies,Modules和Headers,但事情变得复杂了.这就是我所理解的,但如果有人能够澄清一些事情,那将会很棒:

  1. 模块是包含IL代码和元数据表的csc.exe的结果.元数据表包含三个不同的表:

    • 定义表,例如"ModuleDef,TypeDef,PropertyDef,MethodDef,EventDef,FieldDef"
    • 参考表,如"TypeRef,ModuleRef,MemberRef等".
    • 清单表**
  2. 程序集是包含许多模块以及图像,文档,pdf等资源的容器.

  3. 代表Portable Executable的PE文件可以是.EXE或.DLL.这些文件具有PE32或PE32 +标头,CLR标头,元数据,IL代码.

书中说大会是一个由模块组成的容器,它也说管理模块是

管理模块:

托管模块是标准的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可以互换使用吗?

还有,请你解释一下模块中的清单表吗?

.net c# clr assemblies

9
推荐指数
2
解决办法
2798
查看次数

以原生速度运行动态编译的C#代码......怎么样?

我已经阅读了几篇关于编写和编译动态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)

c# compiler-construction assemblies dynamic

9
推荐指数
1
解决办法
4433
查看次数

确定加载的程序集

如何确定我的.NET桌面应用程序已加载的所有程序集?我想将它们放在about box中,这样我就可以通过电话查询客户,以确定他们在PC上有什么版本的XYZ.

很高兴看到托管和非托管程序集.我意识到列表会变长,但我打算对它进行增量搜索.

.net dll assemblies winforms

8
推荐指数
1
解决办法
3138
查看次数

.Net动态加载DLL

我试图编写一些代码,允许我动态地将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)

vb.net reflection dll assemblies

8
推荐指数
1
解决办法
2万
查看次数

为什么Assembly.GetExecutingAssembly()返回null?

我使用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#编写的,并通过安装项目进行部署.

代码最初是在没有错误避免代码的情况下编写的.添加它是为了防止用户获得错误屏幕.异常将写入服务器的事件日志.

c# assemblies embedded-resource system.reflection

8
推荐指数
3
解决办法
1万
查看次数

Web.config更改后,程序集不可用

我正在使用一个自定义框架,它使用反射来GetTypeByName(string fullName)对从数据库获取的完全限定类型名称进行操作,以创建所述类型的实例并将其添加到页面中,从而产生标准的模块化类型.

GetTypeByName是我的一个实用函数,只需迭代Thread.GetDomain().GetAssemblies(),然后执行一个assembly.GetType(fullName)查找相关类型.显然,这个结果会被缓存以供将来参考和使用.

但是,我遇到了一些问题,如果web.config得到更新(并且在一些更可怕的实例中,如果应用程序池被回收)那么它将失去对某些程序集的所有知识,导致无法呈现模块类型.调试显示当前线程程序集列表中不存在缺少的程序集.

为了解决这个问题,我添加了第二个检查,它有点脏,但通过/ bin /目录的DLL进行递归并检查程序集列表中是否存在每个检查.如果没有,则使用Assembly.Load加载它并通过"解决程序集加载上下文问题"修复上下文问题.

这可行,只是看起来(并且我知道这不可能)一些项目仍然可以访问缺少的程序集,例如我的实际Web项目而不是框架本身 - 然后它会抱怨重复的引用已被添加!

有没有人听说过这样的事情,或者有任何想法为什么一个程序集在配置更改时根本不存在?没有一个解决方案,最优雅的解决方法是让bin中的所有程序集重新加载?它需要全部在一个"点击",以便网站访问者除了一个小延迟之外看不到任何差异,因此app_offline.htm文件是不可能的.以编程方式重命名bin中的DLL然后将其命名回来确实有效,但需要IIS用户帐户的"修改"权限,这是疯狂的.

感谢社区可以收集的任何指示!

asp.net reflection assemblies

8
推荐指数
1
解决办法
436
查看次数