C#程序在哪里寻找DLL?

时间:2015-10-21 20:55:57

标签: c# c dll

我写了一个非常简单的C#程序,它打开了一个DLL。有两个项目......(1)项目是作为DLL构建的C函数和(2)使用DLL的C#程序。

C#程序有以下几行:

[DllImport("C_dll.dll", CharSet = CharSet.Unicode)]

但是当我运行它时却找不到DLL。

由于构建在这里显示了DLL:

"W:\Dropbox\DSI (His)\Windows Apps\Debug\C_dll.dll"

我将DllImport更改为:

[DllImport("W:\\Dropbox\\DSI (His)\\Windows Apps\\Debug\\C_dll.dll", CharSet = CharSet.Unicode)]

当然,它会运行。但我希望这个位置是相对的。所以我尝试了这些路径:

[DllImport("..\\..\\..\\Debug\\C_dll.dll", CharSet = CharSet.Unicode)]
    (that is relative to where the projects are)
    and
[DllImport("Debug\\C_dll.dll", CharSet = CharSet.Unicode)]
    (that is relative to where the solution is)

为了检查我的相对路径,我做了一些dirs:

W:\Dropbox\DSI (His)\Windows Apps\Testing\C_sharp\C_dll>dir /s/b "..\\..\\..\\debug\\C_dll.dll" C_dll.vcxproj
W:\Dropbox\DSI (His)\Windows Apps\debug\C_dll.dll
W:\Dropbox\DSI (His)\Windows Apps\Testing\C_sharp\C_dll\C_dll.vcxproj

W:\Dropbox\DSI (His)\Windows Apps>dir /s/b "Debug\C_dll.dll" Apps.sln
W:\Dropbox\DSI (His)\Windows Apps\Debug\C_dll.dll
W:\Dropbox\DSI (His)\Windows Apps\Apps.sln

所以我很困惑。有谁知道我做错了什么?????

构建输出是:

1>------ Rebuild All started: Project: C_dll, Configuration: Debug Win32 ------
1>  C_dll.c
1>     Creating library W:\Dropbox\DSI (His)\Windows Apps\Debug\C_dll.lib and object W:\Dropbox\DSI (His)\Windows Apps\Debug\C_dll.exp
1>  C_dll.vcxproj -> W:\Dropbox\DSI (His)\Windows Apps\Debug\C_dll.dll
2>------ Rebuild All started: Project: Call_C, Configuration: Debug Any CPU ------
2>  Call_C -> W:\Dropbox\DSI (His)\Windows Apps\Testing\C_sharp\Call_C\bin\Debug\Call_C.exe
========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========

我的解决方案的树如下:

W:\DROPBOX
└───DSI
    └───Windows Apps
        ├───c_sharp_test
        │   ├───bin
        │   │   ├───Debug
        │   │   └───Release
        │   ├───obj
        │   │   └───Debug
        │   │       └───TempPE
        │   └───Properties
        └───Debug

.sln文件路径为:

W:\Dropbox\DSI (His)\Windows Apps\Apps.sln

两个项目路径是:

W:\Dropbox\DSI (His)\Windows Apps\Testing\C_sharp\Call_C\Call_C.csproj
W:\Dropbox\DSI (His)\Windows Apps\Testing\C_sharp\C_dll\C_dll.vcxproj

3 个答案:

答案 0 :(得分:1)

[DllImport("C_dll.dll", CharSet = CharSet.Unicode)]是正确的。只需在EXE(Call_C.exe)的同一目录中配置C_dll.dll的输出即可。在Visual Studio中,转到Configuration Manager并在“配置属性/常规”中配置C_dll.dll的输出目录

答案 1 :(得分:0)

我发现搜索库是.EXE所在的位置,因此导入需要像这样:

[DllImport("\\..\\..\\..\\..\\..\\Debug\\C_dll.dll", CharSet = CharSet.Unicode)]

如果有人可以建议一种强制C_dll.dll登陆.EXE的方法,那么我真的很感激这些信息。

由于

答案 2 :(得分:0)

如上所述,最好的办法是将“构建操作”设置为None,将“复制到输出目录”设置为Copy AlwaysCopy if Newer

.Net使用名为Fusion的程序集加载模式,这将在显式路径中查找,在本地(到执行程序集),在GAC中,然后沿路径环境变量。如果您的应用程序是从Internet或Intranet运行,则此逻辑可能不同。

FUSLOGVW将是一个很好的工具,可以看到Fusion想要找到你的dll。但是,最简单的方法是将程序集包含在当前正在执行的程序集文件夹中。