Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C:如何将DLL嵌入资源文件(程序目录中没有DLL副本)_C#_Dll_Resources_Assemblies_Embed - Fatal编程技术网

C# C:如何将DLL嵌入资源文件(程序目录中没有DLL副本)

C# C:如何将DLL嵌入资源文件(程序目录中没有DLL副本),c#,dll,resources,assemblies,embed,C#,Dll,Resources,Assemblies,Embed,我有一个需要X.dll的C应用程序项目a。我已将生成X.dll的项目添加到A中,作为visual studio中的参考。我还将X.dll的发布版本作为二进制文件添加到a中的资源文件中。我已经告诉project A不要将X.dll复制到输出目录 现在我想加载一个.exe,比如说我找不到这个文件,然后查看资源文件并使用Assembly.Loadbyte[]返回X.dll。我有一段代码可以将DLL还原,但是这段代码从未被调用过 目前我有一个非常简单的项目,只是想让它工作起来。没问题。当我运行它时,我在

我有一个需要X.dll的C应用程序项目a。我已将生成X.dll的项目添加到A中,作为visual studio中的参考。我还将X.dll的发布版本作为二进制文件添加到a中的资源文件中。我已经告诉project A不要将X.dll复制到输出目录

现在我想加载一个.exe,比如说我找不到这个文件,然后查看资源文件并使用Assembly.Loadbyte[]返回X.dll。我有一段代码可以将DLL还原,但是这段代码从未被调用过

目前我有一个非常简单的项目,只是想让它工作起来。没问题。当我运行它时,我在X.dll上得到一个FileNotFoundException

我有:

[STAThread]
static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

但是*CurrentDomain_AssemblyResolve*中的断点从未被命中。我立即收到一个FileNotFoundException。当然,我还缺少一些东西?

这个问题似乎与你试图实现的目标非常相似,而且对提问者来说很有效

你做的有什么不同吗?特别是,如果您针对的是较旧版本的.NET Framework,那么这可能是理解应用程序为何表现不同的一个提示

另一个方向,使用工具(如)分析尝试加载部件时发生的情况。这可能会给出更多的提示。如果您设法获取日志信息,在问题中发布它可能有助于某人了解它

编辑:另一个解释,在你的评论之后

现在我想我知道问题出在哪里了

在Main方法中,您引用的是另一个dll中的类型。但是您是在静态代码中进行的,也就是说,您在代码中显式地使用类型,而不是按其名称动态加载类型

为什么这是一个问题?CLR尝试加载程序集以JIT Main自身

编译Main时引发了FileNotFoundException。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())
    {
         // ...
    }
}
重要的区别是Main不依赖于另一个程序集,因此JIT和运行它不会有问题

当MyMain被JIT时,您的事件处理程序已经就位,因此您可以手动加载程序集


顺便说一句,为了避免另一个可能的类似陷阱,请确保定义Main的类中没有任何字段具有来自其他程序集的类型,因为在这种情况下,CLR也会在Main启动之前尝试加载程序集,为了编译它。

您要针对哪个版本的.NET Framework?我的应用程序是.NET4.0,但是这个dll是.NET2.0。我不相信其他问题已经解决。他/她有和我一样的错误,那就是FileNotFoundException。哎呀,按enter键输入linespace,它就提交了。。。无论如何,唯一的区别是我的不是WinForms应用程序。我试图引用的DLL是从一个使用t=newthing{}作为main中的第二行调用的,它位于X.DLL中。第一行是程序集解析的事件处理程序。