C# 类库作为嵌入式资源-可以这样做吗?

C# 类库作为嵌入式资源-可以这样做吗?,c#,.net,class-library,C#,.net,Class Library,我有一个.NET解决方案,我正在编写,最终的结果是一个类库,我应该给客户端一个DLL文件,他可以在他的项目中引用和使用 我的解决方案包括: 类库让我们称之为MyClassLib——这是我应该提供给客户机的实际类库 工具类库-此类库包含的工具不是实际MyClassLib的一部分,但在MyClassLib中使用,因此被MyClassLib引用 控制台应用程序-为客户端测试MyClassLib usless 当我发布时,正如预期的那样,我得到了DLL文件——一个用于MyClassLib,另一个用于工具

我有一个.NET解决方案,我正在编写,最终的结果是一个类库,我应该给客户端一个DLL文件,他可以在他的项目中引用和使用

我的解决方案包括:

类库让我们称之为MyClassLib——这是我应该提供给客户机的实际类库 工具类库-此类库包含的工具不是实际MyClassLib的一部分,但在MyClassLib中使用,因此被MyClassLib引用 控制台应用程序-为客户端测试MyClassLib usless 当我发布时,正如预期的那样,我得到了DLL文件——一个用于MyClassLib,另一个用于工具

我只想给客户端一个DLL文件MyClassLib,该DLL将知道如何使用工具,即使它没有被复制

我想知道是否有办法将工具引用嵌入MyClassLib中。如果是,怎么做?如果不是,在这种情况下你会怎么做


谢谢

我在这方面取得了惊人的成绩。你可以把所有东西合并在一起。我用它将所有内容合并到一个安装程序.exe中,但它同样适用于.dll。

我用它获得了惊人的结果。你可以把所有东西合并在一起。我使用它将所有内容合并到安装程序.exe中,但它同样适用于.dll。

作者Jeffrey Richter向您展示了如何做到这一点

基本上,您可以使用AppDomain.CurrentDomain.AssemblyResolve事件拦截程序集加载并从资源返回程序集

或者,您也可以使用一个实用程序,它可以将多个程序集合并到一个文件中。

作者Jeffrey Richter向您展示了如何执行此操作

基本上,您可以使用AppDomain.CurrentDomain.AssemblyResolve事件拦截程序集加载并从资源返回程序集


或者,您可以使用一个实用程序,该实用程序可以将多个程序集合并到一个文件中。

旧,但将为将来的搜索者发布

构建这样一个类:

class Extractor
{
    public static void ExtractResourceToFile(string resourceName, string filename)
    {
        if (!System.IO.File.Exists(filename))
            using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
            {
                byte[] b = new byte[s.Length];
                s.Read(b, 0, b.Length);
                fs.Write(b, 0, b.Length);
            }
    }
}
然后,添加

Extractor.ExtractResourceToFile("NAMESPACE.YOURDLL.dll", "YOURDLL.dll");
到您的主文件

为了使其工作,只需添加为现有文件,并嵌入构建操作资源


适用于任何第三方dll,您当然可以同时使用dll导入或引用。

旧版,但将为将来的搜索者发布

构建这样一个类:

class Extractor
{
    public static void ExtractResourceToFile(string resourceName, string filename)
    {
        if (!System.IO.File.Exists(filename))
            using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
            {
                byte[] b = new byte[s.Length];
                s.Read(b, 0, b.Length);
                fs.Write(b, 0, b.Length);
            }
    }
}
然后,添加

Extractor.ExtractResourceToFile("NAMESPACE.YOURDLL.dll", "YOURDLL.dll");
到您的主文件

为了使其工作,只需添加为现有文件,并嵌入构建操作资源


适用于任何第三方dll,当然,您可以同时使用dll导入或引用。

您可以使用。您可以使用。在lib/dll中使用AssemblyResolve方法可能会让最终用户感到不快。ILMerge或通常是更好的方法。AssemblyRes是AppDomain的全局函数,在运行时静态初始化,将为每个类型调用resolve错误,无法关闭/优先排序。此外,编译环境不可用,例如VS可能会抱怨,当您在lib/dll中使用AssemblyResolve方法引用具有此类“解析器”的依赖库时,它找不到依赖库,这可能会让最终用户感到不快。ILMerge或通常是更好的方法。AssemblyRes是AppDomain的全局函数,在运行时静态初始化,将为每个类型调用resolve错误,无法关闭/优先排序。此外,编译环境不可用,例如VS可能会抱怨,当您引用带有此类“解析器”的库时,它找不到依赖库。一定会试试的。很好。我一定会试一试的。