2011-11-08 32 views
0

我有一个DLL(Database.dll)内的一类具有静态属性:需要访问类的静态属性不添加DLL依赖

public class Database 
{ 
    public static int[] ReleasedDatabaseVersions 
    { 
     get { return new int[] { 5, 6, 7, 8 }; } 
    } 
} 

我创建了一个独立的可执行文件(ValidateInstall.exe),这需要在Database类中访问ReleasedDatabaseVersions

但是,我想ValidateInstall.exe完全独立于Database.dll(即我希望能够在未安装此DLL的情况下在PC上运行它)。

在C++内联会使这非常容易。这在C#中可能吗?

我不想在我的可执行文件中重复这些数据,因为这将是一个维护头痛。

回答

1

你可以使用ILMerge生成后嵌入汇编抱着Database类到你的EXE:

ILMerge是可以用来 组件合并多个.NET成一个单一的组件的工具。

的ILMerge页面还链接到article by Jeffrey Richter,详细介绍了如何使用ILMerge实现类似没有东西。

+0

谢谢 - 这对我有用。建立@Corey建议的共享DLL然后使用'ILMerge'将这个共享DLL与可执行文件结合起来。这删除了任何运行时的依赖关系。 – LeopardSkinPillBoxHat

-1

在使用DllImport属性请看:

http://msdn.microsoft.com/en-us/library/aa984739(v=VS.71).aspx

修订 如果你不想使用后期绑定的这种方法,总有Assembly类。

Assembly a = Assembly.LoadFrom("Database.dll"); // This will throw an error that you can catch if the file does not exist. 
Database d = a.CreateInstance("Database") as Database; 

现在,我不确定反射是否会带来所有的功能。我之前没有使用过这种方法,所以我无法给你一个正确的解决方案。

+0

这与这个问题有关吗? – LukeH

+0

那么,这是实现后期绑定到一个dll文件的方式。 – Wizetux

+0

是的,OP明确表示他们不想这样做:*“我想'ValidateInstall.exe'完全独立于'Database.dll'(即我想能够在PC上运行它没有安装这个DLL“*。 – LukeH

0

您可以将Database类的源代码作为链接添加到独立项目中,以便两个项目共享一个源代码文件。

使用“添加现有项目...”时,请选择“添加为链接”而不是标准添加。

0

添加引用并包含对构建的可执行文件的引用可以确保程序在没有安装DLL的系统上运行,方法是将其包含在构建中。

我真的不能想什么办法,而无需实际复制DLL或静态内容分发该应用

1

我知道从哪里一些B工程项目联到其他一些项目中是唯一的情况下,常量和枚举。在我看来,解决你的问题的.NET解决方法是将ReleasedDatabaseVersions分解到第三个项目中。然后这个第三个项目将被ValidateInstall.exe和Database.dll引用。