C# 获取类库路径

5

我有一个类库,其中使用了一些在其自己目录中找到的xml文件。

当从另一个项目引用此库时,如何确保该库从自己的目录中工作?

我尝试过Assembly.GetExecutingAssembly().Location,但仍然返回启动项目的路径。


你的方法听起来是正确的。你确定你正在从库内部调用 GetExecutingAssembly 并且你没有使用库的“本地副本”吗? - Heinzi
(1) 是的 (2) DLL被复制到启动项目的目录中,但XML文件没有随之复制。 - djskinner
好的,(2)是原因。复制是由Visual Studio完成的,所以运行的应用程序无法知道此文件的原始位置。 - Heinzi
4个回答

14

我知道这是一篇旧帖子,但如果有人通过搜索偶然看到它,我发现最简单的方法是:

Public Class Foo

     Public Shared Function GetMyPath() As String
          Return Path.GetDirectoryName(GetType(Foo).Assembly.Location)
     End Function

End Class

8
你是认真的吗? - Leif
5
@Leif,哈哈哈,我不记得写下这个(蠢)评论了;很有可能是在喝醉的时候留的。 - iamserious

6

这是因为你的启动项目有两种选项可以加载库:

  1. 将库文件复制到它自己的文件夹中(这会导致你正在尝试的行为)
  2. 从全局程序集缓存(GAC)加载它(这会使任何XML都无法从它的文件夹中加载)

因此,你有两个选择:

  1. 在项目中导入XML文件,并将它们嵌入到类库中作为“嵌入式资源”,然后在运行时将其加载到内存中。
  2. 在项目中导入XML文件,并将文件的“复制到输出目录”属性更改为“true”。

第二点起作用了。然而,这似乎不是一个理想的解决方案,因为可能会发生冲突。之前无法工作的原因是我在另一个被引用的项目中也有一个Data目录。 - djskinner
请使用选项1,但应用程序用户将无法编辑XML文件。我看不到其他选项。 - Andre Pena
要添加其他选项:将XML文件放入某个指定的数据目录中,并将该目录路径存储在您的app.config中。之后,您会将项目部署到其他计算机并在Visual Studio之外使用它,对吧? - Heinzi

0

我认为你只有在新的AppDomain中启动它,但这会带来更多麻烦。最好将它所需的文件复制到你自己的项目中,并将它们放在相对于你的工作目录的位置。

(你可能还想问原始开发人员为什么不能将所需文件的路径作为参数给出。这是解决此问题的正常方式。)


我是原始开发者,所以这可能是一个选项,但我不想为每个使用该库的项目保留相同XML文件的单独副本。 - djskinner

0

我相信有一些函数可以从ExecutingAssembly中获取已加载程序集的列表,循环遍历该列表以查找您的组件(类库),然后获取其位置。对于含糊的答案,我感到抱歉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接