0

我不想要这个:Assembly.LoadFrom(PathToAssembly)

我需要真正将运行时代码中的 dll 带到我的项目中,然后在没有激活器类的情况下正常使用它的类。就像我加载网络一样。dll 文件不是在运行时添加到我的项目中,但现在我需要在运行时添加。

4

4 回答 4

3

在这种情况下,您将遵循接口模式。您可以在其中创建具有所有所需方法存根的接口类。您仍将执行您的 Assembly.Load,但随后将生成的激活对象强制转换为您的接口类。

我没有 c# 中的示例,但是这个 vb.net 应该很容易理解。

Dim alib As Byte() = System.IO.File.ReadAllBytes(Application.StartupPath & "\\PeriodicMinimumsUtilities.dll")
Dim adeb As Byte() = System.IO.File.ReadAllBytes(Application.StartupPath & "\\PeriodicMinimumsUtilities.pdb")
Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.Load(alib, adeb)
Dim type As Type = Assembly.GetType("PeriodicMinimumsUtilities.frmPeriodicMinimumsReconcilliation")
Dim obj As Fireblade.POS.Business.IPeriodicMinimumsUtilities = Activator.CreateInstance(type)

界面:

Public Interface IPeriodicMinimumsUtilities

    WriteOnly Property Database() As Meritsoft.GolfRez.Data.Database
    Function LoadMinimumsDataSource(ByVal v_fiscalYear As String, ByVal v_fiscalPeriod As Integer) As DataSet
    Function GetMinimumsSpent(ByVal v_fiscalYear As String, ByVal v_fiscalPeriod As Integer) As DataTable
    Function LoadFiscalPeriodsDataSource(ByVal ImposeLimit As Boolean) As DataSet

End Interface
于 2013-04-12T08:02:43.787 回答
1
  1. 您需要像通常那样引用 DLL 才能“使用”它
  2. 然后,使用LoadFrom或者,例如,您可以将程序集作为资源嵌入,并从流中加载它
于 2013-04-12T08:00:12.493 回答
0

除了 .Net 提供的方法之外,没有其他方法可以在运行时在 .Net 中动态加载程序集Assembly。也许您有一个与您提到的方法调用相关的更具体的问题。如果是这样,请通过更新您的问题来指定它,以便社区可以为您提供帮助。

于 2013-04-12T08:02:39.670 回答
0

您不能使用类型信息(通常使用类)并在运行时加载 dll,因为您将没有类型信息可供编译。

您可以正常使用接口并针对接口加载 dll,或者您可以仅引用 dll 并正常使用类。

第三种选择(但一个糟糕的想法)是反映您尝试使用的所有类,使用辅助方法和字符串来识别属性和方法。这不是使用类的正常方式,但它实际上会在不存在类型信息的情况下编译。

于 2013-04-12T08:11:27.507 回答