Nic*_*ick 0 c# embed dll resources assemblies
我有一个需要X.dll的C#应用程序(项目A).我已经将生成X.dll的项目添加到了Visual Studio中作为参考.我还将X.dll的发布版本添加到A中的资源文件中作为二进制文件.我告诉项目A 不要将X.dll复制到输出目录.
现在我想要A.exe加载,说"嘿我找不到这个文件",然后查看资源文件并使用Assembly.Load(byte [])获取X.dll.我有代码重新魔术DLL,但这个代码永远不会被调用.
目前我有一个骨头简单的项目,只是试图让它工作.它编译好了.当我运行它时,我在X.dll上得到一个FileNotFoundException.
我有:
[STAThread]
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
Run Code Online (Sandbox Code Playgroud)
但*CurrentDomain_AssemblyResolve*中的断点永远不会被击中.我立即得到一个FileNotFoundException.当然有一些我遗失的东西?
Ran*_*Ran 10
这个问题似乎与你想要实现的问题非常相似,并且它对提问者起作用.
你有不同的做法吗?具体来说,如果您的目标是.NET Framework的旧版本,那么这可能是您理解应用程序行为方式不同的暗示.
另一个方向是使用Fusion Log Viewer等工具分析试图加载程序集时发生的情况.这可能会提供更多提示.如果您设法获取日志信息,将其发布在问题中可能有助于某人解决问题.
编辑:另一个解释,跟随你的评论.
好吧,现在我想我知道问题是什么.
在您的Main方法中,您正在引用其他dll中的类型.但是你是在静态代码中进行的,即在代码中显式使用类型(而不是通过名称动态加载它).
为什么这是个问题?CLR尝试加载程序集以便JIT Main本身.
你被编译时FileNotFoundException被扔了Main.Main甚至没有开始运行,因此你的事件处理程序没有注册.
检查我是否正确的一种简单方法是将代码更改为:
static public void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += MyEventHandler;
MyMain();
}
// The CLR will actually try to load your assembly before even starting the execution
// of this method. It needs the assembly in order to JIT the method because it has to
// know the Thing type.
static public void MyMain()
{
using(var thing = new Thing())
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
重要的区别在于它Main不依赖于另一个程序集,因此JIT并没有问题并且运行它.
到MyMainJIT时,您的事件处理程序已经就位,因此您可以手动加载程序集.
顺便说一句,为了避免另一个可能的类似陷阱,请确保Main定义的类没有任何具有来自其他程序集的类型的字段,因为在这种情况下,CLR也会尝试在Main启动之前加载程序集,为了编译它.