我有这个现有的代码:
Private Function GetTypeFromName(ByVal FullTypeName As String, ByVal AssemblyName As String) As Type
Dim DirStr = New FileInfo(System.Reflection.Assembly.GetExecutingAssembly.Location).DirectoryName
Dim Asm = [Assembly].LoadFile(DirStr & "" & AssemblyName & ".dll")
Return Asm.GetType(FullTypeName)
End Function
调用此例程的结果是一个类型,然后将在应用程序中实例化并使用该类型。
以前的使用和假设
此代码以前在Winforms应用程序中用于根据从配置文件加载并传递到此函数的数据定位类型。
一般来说,申请书已经引用了所寻求的大会,但情况并非总是如此。
正如您所看到的,代码当前希望传递的程序集名称不带".dll"后缀或路径,并进一步假设它与执行程序集位于同一文件夹中。
到目前为止,这些假设都是正确的。
一切都变了
现在我正在Web应用程序中执行此代码,执行程序集的文件夹似乎是…
C:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files<assemblyName>ae5faeca7d2a827fassemblydl3212260f8 af7415f_9747cc01<assemblyName>.DLL
此外,此文件夹中没有其他dll。
我希望这个文件夹将是我的web应用程序的bin文件夹,并且所有其他程序集都可以从那里获得。
所以在Web应用程序中,如何从另一个程序集中加载类型
您需要做的是确保您试图加载的程序集位于网站目录(bin、app_data等(中。
之后,你需要对程序集所在的目录执行HttpServerUtility.MapPath。一旦你有了它,你就可以加载它了。
Private Function GetTypeFromName(ByVal FullTypeName As String, ByVal AssemblyName As String) As Type
Dim DirStr = HttpServerUtility.MapPath( "/bin" ) //assuming you are loading from the bin directory of your website
Dim Asm = [Assembly].LoadFile(DirStr & "" & AssemblyName & ".dll")
Return Asm.GetType(FullTypeName)
End Function
MSDN for HttpServerUtilityhttp://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx
希望这能帮助