Jaka jest różnica między ustawieniem opcji Embed Interop Types true i false w programie Visual Studio?

121

W Visual Studio podczas dodawania jednego odwołania do projektu okno właściwości ma opcję Embed Inteop Types, czy powinniśmy ustawić ją na Trueczy False? Co za różnica?

Ponieważ mamy wiele projektów, wśród niektórych z nich było odniesienie False, inne były ustawione True, jest to totalny bałagan. Serwer bulid również ma te same ostrzeżenia:

Co oznacza „utworzono odniesienie do osadzonego zestawu międzyoperacyjnego”?

Więc planujemy zmienić wszystko Embed Inteop Types, aby Falseto, co chcielibyśmy dostać ryzyko?

Jerry Bian
źródło
4
Nigdy tego nie rób, to niesamowita funkcja, która rozwiązuje irytujące szczegóły wdrażania. Musisz zrozumieć COM, aby naprawdę zrozumieć, o co w tym wszystkim chodzi.
Hans Passant
@HansPassant, czy mówisz, że nigdy ich nie ustawiaj falselub nigdy ich nie zmieniaj (np. Jeśli są falsejuż ustawione domyślnie )?
noelicus
2
Planuje ustawić to na Fałsz. Nigdy tego nie rób.
Hans Passant
3
@HansPassant, jak to się dzieje, że używasz irytującego i grokowego. jest bardzo brittish: D
Mafii
4
@Mafii Myślałem, że grok pochodzi od Stranger in a Strange Land (który jest amerykański). Nie oznacza to oczywiście, że Brytyjczycy nie będą go częściej używać!
UuDdLrLrSs

Odpowiedzi:

79

Ta opcja została wprowadzona w celu wyeliminowania potrzeby wdrażania bardzo dużych zestawów PIA (Primary Interop Assemblies) na potrzeby współpracy międzyoperacyjnej.

Po prostu osadza zarządzany kod mostkujący, który pozwala rozmawiać z niezarządzanymi zestawami, ale zamiast osadzać to wszystko, tworzy tylko rzeczy, których faktycznie używasz w kodzie.

Przeczytaj więcej w poście na blogu Scotta Hanselmana o tym i innych ulepszeniach VS tutaj .

Co do tego, czy jest to zalecane, czy nie, nie jestem pewien, ponieważ nie muszę korzystać z tej funkcji. Szybkie wyszukiwanie w Internecie daje kilka potencjalnych klientów:

Jedynym ryzykiem obrócenia ich wszystkich na fałszywe jest więcej problemów związanych z wdrażaniem plików PIA i większe wdrożenie, jeśli niektóre z tych plików są duże.

Adam Houldsworth
źródło
1
Należy pamiętać, że istnieje dość znacząca różnica, która może spowodować uszkodzenie istniejącego kodu podczas wyłączania typów osadzania międzyoperacyjnego . Różnica jest wymieniona tutaj : „C # 4 i nowsze wersje automatycznie konwertują zwracany obiekt na dynamiczny, jeśli do zestawu odwołuje się opcja kompilatora / link lub, równoważnie, jeśli właściwość Excel Embed Interop Types jest ustawiona na true. Wartość True jest wartością domyślną tej właściwości ”.
Dirk Vollmar
Wbudowane zespoły międzyoperacyjne sprawiały mi problemy w systemie opartym na wtyczkach, w którym zarówno host, jak i wtyczki zależą od tego samego obiektu COM . Innym problemem było scalanie takich zestawów z ILMerge .
Ant_222
8

Zauważyłem, że gdy jest ustawiony na false, jestem w stanie zobaczyć wartość elementu za pomocą debugera. Gdy była ustawiona na true, otrzymywałem błąd - item.FullName.GetValue Osadzony typ międzyoperacyjny „FullName” nie zawiera definicji „QBFC11Lib.IItemInventoryRet”, ponieważ nie był używany w skompilowanym zestawie. Rozważ rzutowanie na obiekt lub zmianę właściwości „Embed Interop Types” na true.

user890332
źródło