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

c#程序在哪里查找DLL ?

[DllImport("C_dll.dll", CharSet = CharSet.Unicode)]是正确的。只需将C_dll.dll的输出配置在与您的EXE (Call_C.exe)相同的目录中。在Visual Studio中,进入配置管理器,在配置属性/General

中配置C_dll.dll的输出目录。

我发现搜索基础是。exe所在的位置,所以导入需要像这样:

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

如果有人能建议一种方法来强制C_dll.dll着陆的。exe是,然后我真的很感激的信息。

谢谢

如上所述,最好的做法是将"Build Action"设置为None,将"Copy to Output Directory"设置为Copy AlwaysCopy if Newer

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

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