我正在使用商业C#应用程序,该应用程序旨在允许使用应用程序在运行时加载的外部插件。基本上,您创建一个类库,从基础应用程序继承和扩展某些类,并将您的DLL放在主应用程序查找它的指定位置。为这个应用程序编写的大多数插件都使用C#,但我想使用VB代替,我认为这应该是可能的。
但是,我在应用程序的错误日志中遇到以下异常:
AssemblyLoader:异常加载' Thingamajig': System.Reflection.ReflectionTypeLoadException:中的类 模块无法加载。
at(wrapper managed-to-native)System.Reflection.Assembly:GetTypes (布尔)
在System.Reflection.Assembly.GetTypes()[0x00000]中:0
在AssemblyLoader.LoadAssemblies()[0x00000]中:0
有关此例外的其他信息:
System.TypeLoadException:无法加载类型 ' Thingamajig.My.MyProject'来自汇编' Thingamajig, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。
System.TypeLoadException:无法加载类型 ' Thingamajig.My.MyProject + ThreadSafeObjectProvider`1 [T]'从装配 ' Thingamajig,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。
System.TypeLoadException:无法加载类型' MyWebServices'从 汇编' Thingamajig,版本= 1.0.0.0,文化=中立, 公钥=空'
System.TypeLoadException:无法加载类型 ' System.Configuration.ApplicationSettingsBase'来自装配'系统, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'。
System.IO.FileNotFoundException:无法加载文件或程序集 ' Microsoft.VisualBasic,Version = 8.0.0.0,Culture = neutral, 公钥= b03f5f7f11d50a3a'或其中一个依赖。
文件名:' Microsoft.VisualBasic,Version = 8.0.0.0,Culture = neutral, 公钥= b03f5f7f11d50a3a'
" Thingamajig"是我的VB类的名称。 C#app和VB类都引用了.NET 3.5
我是一名业余程序员,所以请放轻松。我认为发生的事情是我的类库引用了主应用程序找不到的某些类型(例如:My.MyProject,System.Configuration.ApplicationSettingsBase,MyWebServices)。我尝试在类库中添加对Microsoft.VisualBasic的引用,但是Visual Studio返回时出现错误,指出该组件已经被构建系统自动引用了#34;。我的代码"测试"非常简单:
Imports System
Imports UnityEngine
Public Class Thingamajig
Inherits PartModule
Private _windowPosition As New Rect()
Public Overrides Sub OnStart(state As StartState)
If state <> StartState.Editor Then
RenderingManager.AddToPostDrawQueue(0, AddressOf ondraw)
End If
End Sub
Private Sub ondraw()
If Me.vessel.active Then
_windowPosition = GUILayout.Window(10, _windowPosition, AddressOf onwindow, "Hello World")
End If
End Sub
Private Sub onwindow(windowid As Integer)
GUILayout.BeginHorizontal(GUILayout.Width(250.0F))
GUILayout.Label("WOW! Isn't this Amazing?")
GUILayout.EndHorizontal()
GUI.DragWindow()
End Sub
End Class
任何想法如何进行?我可以从类库中排除有问题的类型,或以某种方式告诉C#app在哪里找到它们?或者,我试图做的就是不可能?
更新
下面的答案(在VS IDE之外编译)适用于我的示例代码,但实际上并没有做太多。然后我添加了一些外部库,其中一个需要Newtonsoft.Json.dll。我在编译期间引用了该DLL并且它编译得很好,但是当我运行应用程序时,我在日志中得到了这个: System.TypeLoadException:无法加载类型&#39; Newtonsoft.Json.Converters.StringEnumConverter&#39;来自汇编&#39; Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed&#39;。
System.TypeLoadException:无法加载类型&#39; Newtonsoft.Json.Converters.XObjectWrapper&#39;来自汇编&#39; Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed&#39;。
System.TypeLoadException:无法加载类型&#39; Newtonsoft.Json.Linq.Extensions&#39;来自汇编&#39; Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed&#39;。
这是同一个问题吗?如果我用Newtonsoft编译,为什么我会收到这些错误?
答案 0 :(得分:1)
欺骗Unity使用VB?呵呵呵。
我做了类似于Xamarin的事情,要做到这一点你必须手动编译DLL并从库中删除Microsoft.VisualBasic引用(然后你会畏缩所有必须替换的代码才能使用标准框架函数)。
这里的起点是我们用来编译MonoTouch的内容。
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Vbc.exe /sdkpath:(path to Unity framework) /noconfig /verbose /novbruntimeref /imports:System,System.Reflection,System.Collections,System.Collections.Generic /nowarn:42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 /optionstrict+ /rootnamespace:(your namespace) /define:"_MyType=\"Empty\"" /reference:(all your needed libraries) /target:library "(path to source code)\*.vb"