2014-06-25 78 views
2

我正在使用商業C#應用程序,它旨在允許使用應用程序在運行時加載的外部插件。基本上,您創建了一個類庫,它可以繼承和擴展基礎應用程序中的某些類,並將您的DLL放置在主應用程序查找的指定位置。大多數爲這個應用程序編寫的插件使用C#,但我想用VB代替,我認爲這應該是可能的。C#應用程序無法從VB類庫中找到類型

不過,我得到以下例外的應用程序的錯誤日誌:

AssemblyLoader: Exception loading 'Thingamajig': System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.

at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)

at System.Reflection.Assembly.GetTypes() [0x00000] in :0

at AssemblyLoader.LoadAssemblies() [0x00000] in :0

Additional information about this exception:

System.TypeLoadException: Could not load type 'Thingamajig.My.MyProject' from assembly 'Thingamajig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

System.TypeLoadException: Could not load type 'Thingamajig.My.MyProject+ThreadSafeObjectProvider`1[T]' from assembly 'Thingamajig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

System.TypeLoadException: Could not load type 'MyWebServices' from assembly 'Thingamajig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

System.TypeLoadException: Could not load type 'System.Configuration.ApplicationSettingsBase' from assembly 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.

File name: 'Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

「Thingamajig」是我的VB類的名稱。 C#應用程序和VB類參考.NET 3.5

我是一個業餘程序員,所以請容易在我身上。我認爲發生了什麼是我的類庫正在引用主應用程序找不到的某些類型(例如:My.MyProject,System.Configuration.ApplicationSettingsBase,MyWebServices)。我試圖在類庫中添加對Microsoft.VisualBasic的引用,但Visual Studio返回一個錯誤,指出此組件已被「構建系統自動引用」。我對此「測試」的代碼非常簡單:

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#應用程序在哪裏可以找到它們?或者,我正在努力做什麼根本不可能?

UPDATE:

以下(編譯VS IDE之外),答案工作了我的示例代碼,並沒有真正做多。然後我添加了一些外部庫,其中一個需要Newtonsoft.Json.dll。我在編譯過程中引用了這個DLL,它編譯的很好,但是當我運行應用程序時,我在日誌中得到了這個: System.TypeLoadException:無法從程序集'Newtonsoft.Json,Version ='中加載類型'Newtonsoft.Json.Converters.StringEnumConverter' 4.5.0.0,文化=中立,PublicKeyToken = 30ad4fe6b2a6aeed'。

System.TypeLoadException:無法從程序集'Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'加載類型'Newtonsoft.Json.Converters.XObjectWrapper'。

System.TypeLoadException:無法從程序集'Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'加載類型'Newtonsoft.Json.Linq.Extensions'。

這是一樣的問題?如果我用Newtonsoft編譯,爲什麼我會得到這些錯誤?

+0

向我們展示加載類的代碼。 –

+0

嘗試將「項目屬性/設置/訪問修改器」設置爲「朋友」。 – dummy

+0

@RobertHarvey C#是一個商業應用程序,沒有源代碼可用。它被設計爲可擴展的,但我僅限於修改VB類庫。 – Timbo

回答

1

Triying to cheat Unity to use 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"

+0

在VB命名空間中沒有很多**錯過。 ..當你完成「cringing」時,你可以陶醉於C#代碼的外觀。 – Plutonix

+0

@Plutonix你確定嗎?你知道甚至比較一個字符串在VB中使用Microsoft.VisualBasic嗎?我不是那個在VB中編程的人,但是我記得我的合作伙伴把他的空氣分開,因爲他必須重寫的所有代碼...... – Gusman

+0

我在一個新項目上做的第一件事就是將它刪除。至於字符串,有'System.String'和'VisualBasic.Strings'這是不同的。 VB中公開了所有那些舊的函數,如Asc,Chr,Len等,在某些情況下它們只是調用相關的'System.String'函數/方法。 'StrComp'需要VB命名空間,但'String.Compare'功能同樣強大,如果不是這樣的話。 – Plutonix

相關問題