Wpisz dostawcę wywołującego inny plik DLL w F #
W konstrukcji reprezentacji wewnętrznej dla podanego typu wywołuję pośrednio w cudzysłowie wewnętrzną reprezentację mojego typu, inną bibliotekę dll, której kod mogę modyfikować.
Obecnie, kiedy konsumuję dostawcę typu, mówi mi, że nie może znaleźć takiej biblioteki DLL:
„Nie można załadować pliku lub złożenia xxxx lub jeden z jego zależności”
Kiedy jednak sprawdzam VS za pomocą Process Explorer, widzę załadowaną bibliotekę XXX ... Czy jest coś do zrobienia, aby kod w cudzysłowie akceptował kod spoza biblioteki DLL?
** aktualizacja **
Próbowałem z uproszczonym przykładem i wygląda na to, że można wywołać taką zewnętrzną bibliotekę dll bez specjalnego działania. W moim przypadku wszystkie dll XXX zależą od załadowanych, widzę je w Eksploratorze procesów, jak również w oknach modułów, gdy debuguję sam devenv.exe ....
Nie mam pojęcia, gdzie szukać. Oto wewnętrzny wyjątek.
** aktualizacja **
Jeśli skopiuję bibliotekę xxx dll i jej zależności w jednej z tych ścieżek, kompilator działa dobrze. Nadal zastanawiam się, co może wywołać devenv.exe, aby poprawnie wyświetlał je załadowane, ale niedostępne.
<code>=== Pre-bind state information === LOG: User = xxx\Administrator LOG: DisplayName = bloombergapi, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified) LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/ LOG: Initial PrivatePath = NULL Calling assembly : (Unknown). === LOG: This bind starts in default load context. LOG: Using application configuration file: C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\11.0\devenv.exe.config LOG: Using host configuration file: LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/bloombergapi/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/PublicAssemblies/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/PublicAssemblies/bloombergapi/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/PrivateAssemblies/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/PrivateAssemblies/bloombergapi/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/bloombergapi/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/CommonExtensions/Platform/Debugger/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/CommonExtensions/Platform/Debugger/bloombergapi/bloombergapi.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE/PrivateAssemblies/DataCollectors/bloombergapi.DLL. </code>
...
ODPOWIEDŹ
Wywołanie funkcji, która przyjmuje jako argument typ z innej biblioteki, wydaje się niemożliwe. Typ unii działa, ale nie jest poprawny typ ... Jest to zilustrowane poniżej
--Library.dll
<code>namespace Library module SampleModule = type LocalUnion = | LocalUnion of int type Localtype() = member x.value = 2 </code>
--LibraryTP.dll
<code>namespace LibraryTP module Module = open System.Reflection open Samples.FSharp.ProvidedTypes open FSharpx.TypeProviders.DSL open Microsoft.FSharp.Core.CompilerServices let f a = Library.SampleModule.sampleFunction a a let g (a:Library.SampleModule.LocalUnion) = let (Library.SampleModule.LocalUnion(v)) = a v let ftype (a:Library.SampleModule.Localtype) = a.value let createTP ns = erasedType<obj> (Assembly.GetExecutingAssembly()) ns "Outside" |> staticParameter "file" (fun typeName (parameterValues:string) -> erasedType<obj> (Assembly.GetExecutingAssembly()) ns typeName |+!> ( provideProperty "test" //OK typeof<float> (fun args -> <@@ g ( f 2 ) @@>) |> makePropertyStatic ) |+!> ( provideProperty "test2" //KO typeof<int> (fun args -> <@@ ftype ( Library.SampleModule.Localtype()) @@>) |> makePropertyStatic ) ) [<TypeProvider>] type public CustomTypeProvider(cfg:TypeProviderConfig) as this = inherit TypeProviderForNamespaces() do this.AddNamespace("TP", [createTP "TP"]) [<TypeProviderAssembly>] do() </code>
- Program.fs
<code> type sampleValue = TP.Outside<""> [<EntryPoint>] let main(args) = let t = sampleValue.Test //OK let tt = sampleValue.Test2 //KO </code>