То, что я сделал в прошлом, должно иметь файл конфигурации по умолчанию, в котором регистрируются к управлению исходным кодом. Затем у каждого разработчика есть их собственный файл конфигурации переопределения, который исключен из управления исходным кодом. Приложение сначала загружает значение по умолчанию, и затем если файл переопределения присутствует, загрузки это и использует какие-либо настройки от переопределения в предпочтении к файлу по умолчанию.
В целом, чем меньший файл переопределения, тем лучше, но это может всегда содержать больше настроек для разработчика с очень нестандартной средой.
В BCL нет встроенной функции, которая выполняла бы аналогичные функции. Я думаю, что лучший вариант, который у вас есть, - это pInvoking в WNetGetConnection, как вы предложили.
P / Invoke WNetGetUniversalName ()
.
Я сделал это, изменив этот код с www.pinvoke.net.
Попробуйте этот код, он написан на Delphi .Net
, вы должны перевести его на C #
function WNetGetUniversalName; external;
[SuppressUnmanagedCodeSecurity, DllImport(mpr, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'WNetGetUniversalNameA')]
function ExpandUNCFileName(const FileName: string): string;
function GetUniversalName(const FileName: string): string;
const
UNIVERSAL_NAME_INFO_LEVEL = 1;
var
Buffer: IntPtr;
BufSize: DWORD;
begin
Result := FileName;
BufSize := 1024;
Buffer := Marshal.AllocHGlobal(BufSize);
try
if WNetGetUniversalName(FileName, UNIVERSAL_NAME_INFO_LEVEL,
Buffer, BufSize) <> NO_ERROR then Exit;
Result := TUniversalNameInfo(Marshal.PtrToStructure(Buffer,
TypeOf(TUniversalNameInfo))).lpUniversalName;
finally
Marshal.FreeHGlobal(Buffer);
end;
end;
begin
Result :=System.IO.Path.GetFullPath(FileName);
if (Length(Result) >= 3) and (Result[2] = ':') and (Upcase(Result[1]) >= 'A')
and (Upcase(Result[1]) <= 'Z') then
Result := GetUniversalName(Result);
end;
Пока.