Mam natywną bibliotekę C i chcę zrobić z nią kodowanie F #. Chodzi o to, otrzymuję wyjątek:F # Konstrukcje Marshalla z polem typu delegata
System.TypeLoadException: Nie można feldmarszałek „log” typu „LoggingModel”: Nie ma wsparcia Organizowanie tego typu.
w System.StubHelpers.ValueClassMarshaler.ConvertToNative (IntPtr DST IntPtr SRC IntPtr PMT CleanupWorkList & pCleanupWorkList)
w FSI_0009.Initialize (ComponentOverrideFlags flag, LoggingModel & loggingModel, ThreadingModel & ThreadingModel, SchedulingModel & schedulingModel, IntPtr memoryModel)
na $ FSI_0011.main @() w . D: \ dev_p \ f # \ FunBindings \ FunExample \ Environment.fs: linia 16 przerwane z powodu błędu
Oto kod:
module Interop
[<CLSCompliant(true); Flags>]
type LogTarget =
| None = 0
| Console = 1
| Trace = 2
| Custom = 4
[<UnmanagedFunctionPointer(CallingConvention.Cdecl)>]
type LogCallback = delegate of LogTarget * string * string * nativeint -> unit
[<UnmanagedFunctionPointer(CallingConvention.Cdecl)>]
type ReleaseCallback = delegate of nativeint -> unit
[<Struct>]
type LoggingModel =
val mutable targets : LogTarget
val mutable log : LogCallback
val mutable deleteModel : ReleaseCallback
val mutable userparam : IntPtr
[<DllImport("CLIBRARY.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "txInitialize")>]
[<MethodImpl(MethodImplOptions.ForwardRef)>]
extern int Initialize(ComponentOverrideFlags flags, LoggingModel& loggingModel, ThreadingModel& threadingModel, SchedulingModel& schedulingModel, IntPtr memoryModel)
module Environment
let initialize =
let mutable loggingModel = new LoggingModel()
let mutable threadingModel = new ThreadingModel()
let mutable schedulingModel = new SchedulingModel()
Initialize(ComponentOverrideFlags.None, &loggingModel, &threadingModel, &schedulingModel, IntPtr.Zero)
Zasadniczo, pojawia się wspomniany błąd, gdy próbuję wykonać „zainicjować” funkcję w interaktywny.
Byłbym wdzięczny za każdą pomoc.
Aktualizacja: Sprawdziłem kod nieco więcej i zauważyłem, że poza konsolą interaktywną wydaje się działać, bez żadnych wyjątków. Muszę zapewnić nieco więcej zasięgu dla biblioteki, aby mieć pewność. W międzyczasie, jeśli ktoś, kto wie, co może spowodować ten wyjątek i jak można mu zapobiec, naprawdę byłbym wdzięczny za odpowiedź.
Przepraszam, Tim, to nie pomogło. Będę edytować pytanie z pełnymi informacjami o wyjątku. – PompolutZ