如何告诉我的应用程序在特定文件夹中查找 dll

问题描述 投票:0回答:1

我正在编写一个 .net Framework 4.8.1 应用程序,该应用程序引用来自几个不同第三方应用程序的大约 2 打 dll。这些 dll 又引用这些应用程序中的更多(数千个)dll。第三方应用程序是非常大的机器视觉/人工智能软件程序。为了让我的应用程序运行,我需要将整个程序复制到我的 bin 文件夹,否则我会收到 dll not found 错误。

程序 1 是 6GB,程序 2 是 4GB,所以我的 bin 文件夹大小约为 10GB,在我的开发 PC 上,调试文件夹中有 10GB,发布文件夹中有 10GB,我有大约 50 个不同的此类程序开发都需要这样做,需要大约 TB 的空间。我的磁盘空间开始不足。我如何告诉我的应用程序在这些文件夹中查找任何额外的 dll 和引用,并且当我部署此软件时,它将在已部署的系统上执行相同的操作。这是用于工业自动化的软件,因此它只会部署在由我严格控制和设置的一台 PC 上。

C:\My Application Folder
C:\Program Files\Application 1
C:\Program Files\Application 2
c# .net wpf vb.net dll
1个回答
0
投票

感谢 djv,它引导我走上了一条有效的道路,但它很笨拙。

我最终将此代码添加到我的 Application.xaml.vb 文件中。不过,似乎应该有一种更好更简单的方法来做到这一点。

Class Application

    Private ReferenceFolders As New List(Of String) From {"C:\Program Files\Program 1"} , "C:\Program Files\Program 2"}



    Private Sub Application_Startup(sender As Object, e As StartupEventArgs) 'Handles Me.Startup

        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CurrentDomain_AssemblyResolve
        ' other stuff
    End Sub

    Private Sub Application_Exit(sender As Object, e As ExitEventArgs) Handles Me.[Exit]
        ' other stuff
        RemoveHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CurrentDomain_AssemblyResolve
    End Sub

    Private Function CurrentDomain_AssemblyResolve(sender As Object, args As ResolveEventArgs) As Assembly
        Dim myAssemblyName As New AssemblyName(args.Name)

        Dim dllPath As String = FindFile(ReferenceFolders, myAssemblyName.Name & ".dll")
        If dllPath <> "" Then
            Return Assembly.Load(AssemblyName.GetAssemblyName(dllPath))
        End If
        Return Nothing
    End Function

    Private Function FindFile(folders As List(Of String), filename As String) As String
        For Each folderPath In folders
            Dim dirInfo As New DirectoryInfo(folderPath)

            Dim fileList = dirInfo.GetFiles(filename, SearchOption.AllDirectories)
            For Each file In fileList
                If String.Equals(filename, file.Name, StringComparison.InvariantCultureIgnoreCase) Then
                    Return file.FullName
                End If
            Next
        Next

        Return ""
    End Function

End Class

我确实在app.config中尝试过这个,但它不起作用。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
        <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1" />
    </startup>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="C:\Program Files\Program 1" />
        </assemblyBinding>
    </runtime>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="C:\Program Files\Program 2" />
        </assemblyBinding>
    </runtime>
</configuration>

我的代码引用了位于不同程序文件文件夹中的托管 dll(我没有从 bin 文件夹中引用),但这些 dll 确实引用了非托管 dll。我使用构建后复制例程将程序文件中的其他 dll 和文件复制到我的 bin 文件夹中,以便它可以工作,但现在我删除了该构建后副本,并且可以使我的 bin 文件夹明显更小。但如果有人有更好的方法来做到这一点,然后我在这里的方法,那就很高兴知道。

© www.soinside.com 2019 - 2024. All rights reserved.