让我试着解释我的问题.我目前正在尝试开发一个用.Net编写的小型"插件框架"(主要用于实验).因此,我们的想法是通过在主应用程序的特定文件夹"插件"中部署dll来创建一个可以添加"插件"的主应用程序.一切正常,插件正确实例化,但现在我遇到了问题.我现在部署了一个使用其他第三方插件的插件"X",所以现在我遇到的问题是在运行时找不到"X"所需的这些额外的第三方插件.因此,我的想法是现在添加一个额外的目录"dependencies",我还部署了所有需要的插件.
所以我的第一个问题是:如何将程序集加载到应用程序域中(假设我知道它们的路径),我的应用程序可以使用它们吗?
我尝试通过做类似的事情来解决这个问题:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
//find the path to the assembly and then load and return it by
//return Assembly.Load("pathToDependencies/failedAssembly.dll");
}
Run Code Online (Sandbox Code Playgroud)
问题是这个事件处理程序现在被激活,在args变量中有"Presentation.Zune.dll"(我正在使用WPF应用程序).好像那个程序集加载失败但实际问题是另一个dll.
有人可以建议我更好的方法来解决我的问题吗?我希望我能够充分解释我的情况,否则只是要求进一步澄清.
谢谢,Juri
我偶尔使用fuslogvw来追踪加载程序集的问题.在我使用它的所有时间之后,似乎文件夹'NativeImage'具有加载我的dll的原生图像的结果.当找不到本机图像时(通常不是),我认为它会查找.net程序集.'default'文件夹是我通常关心的,因为它有所有程序集绑定的日志,这是我的问题通常所在.
任何人都能解释这里真正的区别吗?
给出以下代码:
var n1 = new AssemblyName ("TestDll, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089");
var n2 = new AssemblyName ("TestDll, Version=2.0.0.2001, Culture=en-US, PublicKeyToken=ab7a5c561934e089");
Console.WriteLine (AssemblyName.ReferenceMatchesDefinition (n1, n2));
Console.WriteLine (AssemblyName.ReferenceMatchesDefinition (n2, n1));
Run Code Online (Sandbox Code Playgroud)
为什么这两个检查都打印“True”?我本以为 AssemblyName.ReferenceMatchesDefinition 应该考虑程序集名称的版本、区域性和公钥标记属性的差异,不是吗?
如果没有,ReferenceMatchesDefinition 能做什么而简单名称的比较却不能做什么?
我想分析一个解决方案,其中包含针对.NET 3.5 SP1的项目以及一些针对.NET 4的项目,这些项目依赖于.NET 3.5库.
当我尝试添加两个程序集时,一个用于.NET 3.5,另一个用于.NET 4,FxCop会抛出异常:
AssemblyLoadException
Conflicting target platforms
'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' vs
'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉FxCop只使用版本4.0.0.0?
设置DisallowApplicationBaseProbing = true时,我需要在创建的AppDomain上连接AssemblyResolve事件。我这样做的原因是强制运行时调用需要解析程序集的AssemblyResolve事件,而不是先进行探测。这样,另一个开发人员就不能仅将MyDllName.dll粘贴在ApplicationBase目录中,并覆盖我想在AssemblyResolve事件中加载的程序集。
这样做的问题如下:
class Program
{
static void Main()
{
AppDomainSetup ads = new AppDomainSetup();
ads.DisallowApplicationBaseProbing = true;
AppDomain appDomain = AppDomain.CreateDomain("SomeDomain", null, ads);
appDomain.AssemblyResolve += OnAssemblyResolve;
appDomain.DoCallBack(target);
}
static System.Reflection.Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
Console.WriteLine("Hello");
return null;
}
private static void target()
{
Console.WriteLine(AppDomain.CurrentDomain);
}
}
Run Code Online (Sandbox Code Playgroud)
代码永远不会超出+ = OnAssemblyResolve行。
当代码尝试执行时,新的应用程序域将尝试解析我正在其中执行的程序集。由于DisallowApplicationBaseProbing = true,因此不知道在哪里可以找到该程序集。看来我有鸡肉和鸡蛋问题。它需要解析我的程序集以连接程序集解析器,但需要程序集解析器来解析我的程序集。
感谢您提供的所有帮助。
-麦克风
SQL Server Edition:2008 Enterprise Visual Studio:2010 w/.NET 4.0
SSMS 2008 Addin - CodePlex上的Data Scripter项目源代码引用 Microsoft.SqlServer.SqlTools.VSIntegration.dll
我已经引用了DLL
<<Microsoft SQL Server install location>>\100\Tools\Binn\VSShell\Common7\IDE
但这是奇怪的.Microsoft.SqlServer.SqlTools.VSIntegration.dll包含一个命名空间Microsoft.SqlServer.Management.UI.VSIntegration,该命名空间又包含ServiceCache(公共密封).
一旦我添加引用,ServiceCache就会突出显示(这意味着没有引用问题)但是当我编译项目并且VS 2010引发一个无法找到ServiceCache的错误时会出现问题.
当前上下文中不存在名称"ServiceCache"
为什么ServiceCache在编译期间不可见但看起来在添加程序集后可用?
并且Reflector确实显示ServiceCache是项目引用的程序集的一部分,但Visual Studio intellisense无法显示它.
有没有这种问题?
[更新]一些截图
反射器清楚地显示 ServiceCache

但Visual Studio 2010说,否则......

我通过C#执行.NET程序集时遇到了一些重大问题.我想从静态类调用静态方法(Main).我让它在当前域中工作,但显然我无法从那里卸载程序集.
首先,我尝试创建一个新的AppDomain:
AppDomain domain = AppDomain.CreateDomain("PluginDomain");
Run Code Online (Sandbox Code Playgroud)
由于我的主要问题是解析我正在尝试加载的程序集,我试图挂钩AssemblyResolve事件:
domain.AssemblyResolve += new ResolveEventHandler(this.OnAssemblyResolve);
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个关于序列化的错误(即这个类).
我已成功加载一个汇编文件,它恰好位于BaseDirectory中,只需使用:
domain.Load("Assembly1");
Run Code Online (Sandbox Code Playgroud)
但有问题的程序集位于BaseDirectory的两个子目录中,即.BaseDirectory\dir1\dir2\Assembly2.dll - 当使用带有字符串程序集名称的domain.Load()(将PrivateBinPath安装到正确的子目录位置)时以及使用带有程序集字节的domain.Load()时,我得到FileNotFoundException (来自File.ReadAllBytes()).
我知道AppDomain.Load()已被删除,但它似乎是唯一可用的方法,考虑到我不想强制包含静态方法的类是非静态和可实例化的.
无论如何,我该怎么做才能确保汇编文件正确加载到新的AppDomain中?
我的主要目标是从程序集中动态执行一个方法,该方法可以调用我自己的程序,但必要时也必须完全卸载程序集.它的目的是成为一个插件系统.
我有一个客户端/服务器项目,我正在尝试通过套接字从服务器向客户端发送DataTable(从TableAdapter中提取).我的服务器命名空间是srvCentral,我的客户端是appClient.当我尝试在客户端反序列化DataTable时,它会抛出一个序列化异常,说无法找到程序集'srvCentral,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'我用谷歌搜索并尝试控制AssemblyResolve之类的东西,这使得svchost挂起并强迫我关闭,并使用这样的绑定器:
sealed class AllowAllAssemblyVersionsDeserializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type typeToDeserialize = null;
String currentAssembly = Assembly.GetExecutingAssembly().FullName;
// In this case we are always using the current assembly
assemblyName = currentAssembly;
// Get the type using the typeName and assemblyName
typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
typeName, assemblyName));
return typeToDeserialize;
}
}
Run Code Online (Sandbox Code Playgroud)
那里的例外情况仍然存在......是不是假设DataTable可以在任何地方进行反序列化?我究竟做错了什么?
我的序列化代码是:
public byte[] Serializar(Object item)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
formatter.Serialize(ms, …Run Code Online (Sandbox Code Playgroud) c# datatable assembly-resolution deserialization binary-deserialization
我在一个DLL中引用了一个exe文件.在DEBUG模式下运行时,一切运行正常,但在Release模式下运行时,抛出异常
System.BadImageFormatException occurred
HResult=-2147024885
Message=Could not load file or assembly 'Presensoft.InlineMarker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Source=Presensoft.ApplicationServer
FileName=Presensoft.InlineMarker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
FusionLog==== Pre-bind state information ===
LOG: DisplayName = Presensoft.InlineMarker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///F:/PresensoftNewTrunk/Trunk/Email Archiver/EmailService/Presensoft.ApplicationServerHost/bin/Release/
LOG: Initial PrivatePath = NULL
Calling assembly : Presensoft.ApplicationServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: …Run Code Online (Sandbox Code Playgroud) .NET(或 Visual Studio)构建如何决定是否将引用的程序集复制到 bin/debug 或 bin/release 目录?(这是一个 .exe 控制台程序。)
在我的机器上,我在 GAC 中有引用的程序集。一位同事将我的 bin/release 复制到他们的计算机上,但它无法运行,因为引用的程序集不在 bin/release 中(并且不在他们的 GAC 上)。
谢谢,
尼尔·沃尔特斯
我在http://wiki.fluentnhibernate.org/Getting_started上完成了Fluent NHibernate教程,项目编译得很好.
但是,我收到运行时错误,我似乎无法解决它.您可以在教程中看到的CreateSessionFactory方法中发生错误.这里是:
private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database
(
SQLiteConfiguration.Standard
.UsingFile(DbFile)
)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<FluentNHibernateSample.Program>())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
我认为最有帮助的事情是给你从最外层异常到最内层异常的异常链(这是一个真正的单词):
An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
Could not compile the mapping document: (XmlDocument)
persistent class FluentNHibernateSample.Entities.Employee, FluentNHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null not found
Could not …Run Code Online (Sandbox Code Playgroud) c# nhibernate visual-studio-2010 fluent-nhibernate assembly-resolution
.net ×6
c# ×6
reflection ×2
.net-3.5 ×1
.net-4.0 ×1
appdomain ×1
build ×1
datatable ×1
fxcop ×1
gac ×1
nhibernate ×1
sql-server ×1
ssms ×1