在msvc中,我可以写
#pragma comment(lib, "my.lib");
在链接阶段包含my.lib。在我的解决方案中,我有2个项目。一个是班级项目,另一个是我的主要项目。如何在代码中包含引用dll而不是在项目中添加引用?
答案 0 :(得分:4)
与流行的看法相反,有可能: - )
要静态链接.NET程序集,请查看ILMerge。它是一个实用程序,可用于将多个.NET程序集合并为一个。无论是可执行文件还是DLL。
您可以创建一个批处理脚本,将程序集打包在一起作为构建后步骤。
编辑:有一点需要注意的是,这并不会消除引用库的需要。仍然需要引用以编译依赖于外部类型的代码。就像在C(++)下包含头文件一样。默认情况下,c#程序集是独立的,不涉及链接。但是,我上面提到的工具允许您创建一个包含外部依赖项的新程序集。
答案 1 :(得分:3)
据我所知,你不能。如果您需要访问非引用程序集中包含的类型,则必须使用Assembly.Load()
。
答案 2 :(得分:2)
我怕你不能。
您可以通过Assembly.Load(...)
动态加载程序集,但是您可以使用反射来显式创建需要使用的每个类型。
答案 3 :(得分:1)
我不认为您可以在不添加引用的情况下从代码中包含dll。但是,您可以使用反射来加载该程序集并使用该程序集中的类型。
Assembly.Load()将为您提供程序集的句柄,然后您应该能够遍历程序集中的类型。
答案 4 :(得分:1)
托管代码不使用链接器。参考程序集的C / C ++等价物是#include指令,您需要在C / C ++中允许编译器为外部类型生成代码。在C#中完全相同的事情,除非编译器有定义,否则不能使用外部类型。参考组件提供了。
C / C ++链接的等价物在运行时在托管程序中完成。 JIT编译器根据需要加载程序集以生成机器代码。
在C#程序中你可以做的一件事是在C / C ++程序中无法做到的是使用Reflection。它允许您调用构造函数并使用类型和方法名称作为字符串调用类型的方法。使用Assembly.GetType()和Type类的方法开始滚动。但是,首先考虑一个带有System.AddIn命名空间的插件模型。
答案 5 :(得分:0)
如果要在运行时加载程序集,可以使用Assembly.LoadFrom(filePath)。但是这样你就不会引用程序集,也不能使用强类型。
例如,您可以使用不同的插件实现已知接口(位于单独的引用程序集中的接口),并将它们全部放在文件夹中。然后,您可以检查文件夹并在运行时加载所有实现类(如this example)。