Mój projekt (jakiś rodzaj silnika przetwarzania) jest podzielony na 2 biblioteki dll: jeden z deklaracjami interfejsów i jeden z funkcjonalności. Zwykle projekt jest używany przez zewnętrzny projekt Delphi za pośrednictwem technologii COM.Jak sprawić, by moja biblioteka dll była ładowalna tylko z kodu?
Powiedzmy, że mój program wycina owoce. Zewnętrzny program delphi tworzy obiekt Fruit i wypełnia jego właściwości: weight (int), Name (string) i ProgressUpdater (typu IProgressUpdater, który jest zadeklarowany w drugim dll z interfejsami). Po tym programie exst programator fragmentatora, tworzy Slicer.AddFruit (newFruit) i wywołuje funkcję Slicer.Slice().
Nic specjalnego. W prawdziwym życiu projekt delphi jest dodatkiem do Outlooka. Ale tutaj jest problem - czasami niektóre dodatki VSTO sprawiają, że Outlook działa w trybie "shadow copy files", więc gdy projekt delphi rozpocznie się i zacznie kreślić obiekt Slicer, nasz C# assembly zostanie umieszczony w folderze temp, a montaż zostanie utworzony za pomocą tej lokalnej ścieżki. Cóż ... to nadal nie jest problem. Ale problem polega na tym, że kiedy projekt delphi tworzy newFruit, a następnie przekazuje obiekt ProgressUpdater, w moim zespole fragmentatora nie mogę uzyskać zewnętrznego ProgressUpdater: "Argument return ma nieprawidłowy typ", ale nadal może uzyskać pole z typami prostymi (Weight, Name).
Dzieje się tak tylko przy włączonym trybie shadowCopyFiles. Zgaduję więc - zewnętrzny montaż ProgressUpdater i montaż fragmentatora są umieszczane w różnych miejscach, więc nie można ich przekazać. Moje pytanie brzmi: jak uniknąć tego, że moja biblioteka dll będzie "shadow copied"? Czy jest jakieś inne rozwiązanie?
Nie znam się dobrze na technologii COM, ale czy z zestawu GAC nie należy łączyć zestawów? Podobnie jak [tutaj] (http://edn.embarcadero.com/article/32754) – netaholic
Hmm, jesteś ofiarą wątpliwych praktyk innego dodatku. Niewiele można z tym zrobić, jeśli nie masz numeru telefonu. Ale jedna rzecz, użyj GAC. Zawsze dobrym pomysłem podczas pisania złożeń ComVisible. –
@HansPassant Problem polega na tym, że mój zespół jest już zarejestrowany w GAC. Ale w jednym przypadku Assembly.GetExecutingAssembly(). Lokalizacja; pokazuje ścieżkę kodu źródłowego (ścieżkę, w której została zarejestrowana z regasmem dla współdziałania COM). ale w innym (po tym dodatku VSTO) - pewna ścieżka temp na dysku systemowym. Myślę, że nie będę miał takiego problemu, jeśli będę mógł zmusić .net do załadowania mojego zestawu tylko ze ścieżki kodu. – Shelest