Tar*_*rik 4 .net c# vb.net assemblies
我试图让所有组件中CurrentDomain
使用AppDomain.CurrentDomain.GetAssemblies()
他们写FullName
成DropDownList
,但是如果我不实例化它们,它们不会在返回数组看到来自GetAssemblies()
中CurrentDomain
.
它们都作为参考和Reference
解决方案的文件夹添加.只有GetAssemblies()
当我第一次实例化时,我才能从中获取它们.
如何以简单和更通用的方式克服这个问题,而不是每次添加新的程序集等时实例化它们.
由于公司政策,我必须模糊图像的某些部分:
所有组件都在Reference文件夹中引用:
除了其他人的评论之外,这里发生了一些微妙的事情.
除非实际使用VisualStudio,否则 VisualStudio实际上不会将.dll引用添加到构建程序集的反射信息的程序集清单中.
作为示例,创建一个新项目,并引用一个程序集.我用它nunit.framework.dll
作为一个例子.
但实际上并没有使用它.我的代码很简单:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
但该项目确实在VisualStudio中引用了NUnit.现在构建它,然后打开程序集,ildasm.exe
清单的顶部是:
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly ConsoleApplication1
{
...etc...
Run Code Online (Sandbox Code Playgroud)
现在,在代码中,只使用NUnit中的任何内容:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Assert.IsTrue(true);
}
}
}
Run Code Online (Sandbox Code Playgroud)
再次重建并检查程序集清单ildasm.exe
:
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly extern nunit.framework
{
.publickeytoken = (96 D0 9A 1E B7 F4 4A 77 ) // ......Jw
.ver 2:6:0:12051
}
.assembly ConsoleApplication1
{
...etc...
Run Code Online (Sandbox Code Playgroud)
请注意,现在IL中有一个外部.这也提供反射,因此它知道要加载的依赖程序集.
过去那个小细节,正如其他人所说的那样,运行时实际上并没有加载一个程序集,直到第一次需要它,因此在你实例化或使用该程序集中的某些东西之前,你的AppDomain没有加载程序集.
当您开始尝试使用该Assembly.GetReferencedAssemblies()
方法时,上面的详细信息将发挥作用.
所以在VisualStudio中,我有一个包含这些引用的项目:
Microsoft.CSharp
nunit.framework
System
System.Core
System.Data
System.Xml
System.Xml.Linq
Run Code Online (Sandbox Code Playgroud)
然后我有C#代码:
using System;
using System.Reflection;
using NUnit.Framework;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
foreach (var assemblyName in assemblies)
{
Console.WriteLine(assemblyName.FullName);
}
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我甚至有一个using NUnit.Framework;
声明!但我实际上并没有在任何地方使用 NUnit,因此它不是引用的程序集.运行它的输出是:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Run Code Online (Sandbox Code Playgroud)
这就对了.如果我将此行添加到我的测试应用中:
Assert.IsTrue(true);
Run Code Online (Sandbox Code Playgroud)
现在有些东西实际使用 NUnit,我的控制台输出是:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
nunit.framework, Version=2.6.0.12051, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1373 次 |
最近记录: |