c#程序在哪里查找DLL ?
本文关键字:DLL 查找 在哪里 程序 | 更新日期: 2023-09-27 18:18:47
我写了一个非常简单的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
此[DllImport("C_dll.dll", CharSet = CharSet.Unicode)]
是正确的。只需将C_dll.dll的输出配置在与您的EXE (Call_C.exe)相同的目录中。在Visual Studio中,进入配置管理器,在配置属性/General
我发现搜索基础是。exe所在的位置,所以导入需要像这样:
[DllImport("''..''..''..''..''..''Debug''C_dll.dll", CharSet = CharSet.Unicode)]
如果有人能建议一种方法来强制C_dll.dll着陆的。exe是,然后我真的很感激的信息。
谢谢
如上所述,最好的做法是将"Build Action"设置为None
,将"Copy to Output Directory"设置为Copy Always
或Copy if Newer
。
。Net使用名为Fusion的程序集加载模式,它将在GAC中沿着显式路径查找本地(到执行程序集),然后沿着路径环境变量查找。如果您的应用程序从internet或intranet运行,则此逻辑可能会有所不同。
FUSLOGVW将是一个很好的工具,看看Fusion在哪里寻找你的dll。但是,最简单的方法是将程序集包含在当前执行的程序集文件夹中。