2015-11-24 94 views
0

我正在嘗試向我正在處理的類型提供程序添加一個功能以允許用戶指定類型。由於類型提供者不能提供泛型方法,因此似乎唯一的方法就是引用具有該類型的程序集。從類型提供程序動態加載程序集

我試圖做一個概念證明這種使用從Owin庫中的類型,但我試圖使用所提供的類型時遇到了一個問題:

enter image description here

它說它找不到該文件,即使它顯然存在,否則我正在使用的CSharpCodeProvider會給出一個錯誤(之前它針對不正確的文件路徑所做的)。我試着在一個單獨的非類型提供項目中再現這個問題,但它在那裏工作。

該項目的代碼是在這裏(輸入型分支): https://github.com/isaksky/routeprovider/tree/input-type

您可以通過打開主RouteProvider解決方案和調試做DebugOwin樣看這個問題(它會打開一個新的實例visual studio中使用RouteProvider的示例解決方案)。

回答

0

有人掛這個答案,其中有問題的解釋和解決辦法:

Type provider calling another dll in F#

我最後不得不使用typeprovider配置(cfg)的ReferencedAssemblies,像這樣:

 _assemblyResolver <- ResolveEventHandler(fun _ args -> 
     let expectedName = (AssemblyName(args.Name)).Name + ".dll" 
     let asmPath = 
      cfg.ReferencedAssemblies 
      |> Seq.tryFind (fun asmPath -> IO.Path.GetFileName(asmPath) = expectedName) 
     match asmPath with 
     | Some f -> Assembly.LoadFrom f 
     | None -> null) 
     System.AppDomain.CurrentDomain.add_AssemblyResolve(_assemblyResolver) 
+1

我擴展了這個想法,讓ResolveEventHandler也查找父目錄中的「packages」文件夾,並在那裏尋找匹配的DLL。 –

0

德米特里的解決方案是一種方法。另一種方法是簡單地確保您的TP依賴關係位於TP本身所在的同一文件夾中。我們使用此機制爲Azure Storage TP

+0

在我的情況下很難做到這一點,因爲直到設計時纔會知道依賴關係。 – Isak