2013-08-28 18 views
6

Istnieje subtelny punkt dotyczący zależności złożeniowych, które chciałbym zrozumieć. Mam projekt, który wykorzystuje SharpDX dzięki niestandardowym owijki tak:Dlaczego nieużywany konstruktor powoduje w tym przypadku zależność od złożenia?

SharpDX.dll < - Wrapper.dll < - Project.dll

W Wrapper.dll to rodzaj takich jak:

public class D3DWrapperTypeA { 
    //public D3DWrapperTypeA(SharpDX.Device device) { 
    //  
    //} 

    public D3DWrapperTypeA(IntPtr devicePointer) { 
     SharpDX.Device device = new SharpDX.Device(devicePointer); 
     // etc 
    } 
} 

W tej klasie, jeśli odkomentuję skomentowany konstruktor, Project.dll musi odwoływać się do SharpDX.dll, nawet jeśli nie używa konstruktora.

Jednak mam również inny typ otoki tak:

public class WrapperTypeB { 
    public SharpDX.Device GetDevice(int adapter) { 
     // etc 
    } 

    public IntPtr GetDevicePointer(int adapter) { 
     return GetDevice(adapter).NativePointer; 
    } 
} 

i tu tak długo, jak nie faktycznie użyć metody GetDevice zwracającą obiekt SharpDX, Project.dll nie potrzebuje odwołać się do SharpDX.dll.

Dlaczego nawet nieużywany konstruktor pobierający parametr typu SharpDX powoduje zależność od SharpDX, a nieużywana metoda zwracająca parametr typu SharpDX nie?

+0

Czy to nie dlatego, że zależności konstruktorów są potrzebne w czasie kompilacji, skoro zależności metod są potrzebne tylko w środowisku wykonawczym? Trochę przypuszczenia, jeśli jestem uczciwy! – Liam

Odpowiedz

6

Jest dość niejasne, jak masz znać masz zależności. Będziesz jednak miał zależność kompilacji. Zależność od środowiska wykonawczego byłaby trudniejsza do wyjaśnienia.

Zależność w czasie kompilacji istnieje, ponieważ kompilator C# twierdzi, że musi znać wszystkie przeciążenia konstruktora, aby mógł wywołać poprawny. Nie będzie mógł tego zrobić, jeśli nie wie nic o SharpDX.Device, jeśli nie może załadować metadanych dla SharpDX.dll.

To jest nie przypadku metody, która zwraca SharpDX.Device, typ zwracany nigdy nie jest używany do określenia, które przeciążenie jest poprawne.

0

W obu przypadkach Twoja Project.dll ma zależność od SharpDX.dll i jest to całkowicie normalne. W obu przypadkach SharpDX.dll zostanie skopiowany do folderu wyjściowego bin i użyty w czasie wykonywania.

W pierwszym przypadku nie trzeba jawnie dodawać odwołania do SharpDX.dll, o ile nie próbujesz wywołać konstruktora klasy D3DWrapperTypeA. Nawet jeśli spróbujesz zadzwonić do drugiego konstruktora, nadal potrzebujesz referencji.

To samo odnosi się do drugiego przypadku: tak długo, jak nigdy nie wywołuje się metody GetDevice, nie trzeba dodawać wyraźnego odniesienia.

Powiązane problemy