C#app无法从VB类库中找到类型

时间:2014-06-25 15:27:44

标签: c# vb.net class

我正在使用商业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编译,为什么我会收到这些错误?

1 个答案:

答案 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"