我写了一个非常简单的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
答案 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 Always
或Copy if Newer
。
.Net使用名为Fusion的程序集加载模式,这将在显式路径中查找,在本地(到执行程序集),在GAC中,然后沿路径环境变量。如果您的应用程序是从Internet或Intranet运行,则此逻辑可能不同。
FUSLOGVW将是一个很好的工具,可以看到Fusion想要找到你的dll。但是,最简单的方法是将程序集包含在当前正在执行的程序集文件夹中。