У меня есть DLL-библиотека SharePoint, которая выполняет некоторые функции лицензирования, и в качестве части кода она использует внешнюю DLL-библиотеку C ++ для получения серийного номера жесткого диска.
Когда я запускаю это приложение в Windows Server 2003, оно работает нормально, но в Windows Server 2008 весь сайт (загружается при загрузке) падает и постоянно сбрасывается. Это не Windows Server 2008 R2, а то же самое в 64 или 32 битах.
Если я поставлю Debugger.Break
перед выполнением DLL, я вижу, что код достигает точки разрыва, а затем никогда больше не возвращается в DLL. Я получаю некоторые предупреждения об отладочных утверждениях внутри функции, опять же только в Windows Server 2008, но я не уверен, что это связано.
Я создал консольное приложение, которое запускает C # DLL, которая, в свою очередь, загружает C ++ DLL, и это прекрасно работает на Windows Server 2008 (хотя оно показывает ошибки утверждения, но я их сейчас подавляю).
Ошибки утверждения не в моем коде, а в пределах ICtypes.c
, и я не могу их отлаживать.
Если я ставлю точку останова в DLL, она никогда не срабатывает, и компилятор говорит:
"step in: Stepping over non user code"
Если я пытаюсь выполнить отладку в DLL с помощью Visual Studio.
Я попытался обернуть код, используемый для вызова DLL, в:
SPSecurity.RunWithElevatedPrivileges(delegate()
Но это тоже не помогает.
У меня есть исходный код для этой DLL, так что это не проблема.
Если я удаляю DLL из каталога, я получаю ошибку об отсутствующей DLL. Если я заменю его, вернемся к отсутствию ошибок или предупреждению, просто полный сбой.
Если я заменю этот код жестко закодированной строкой, все приложение будет работать нормально.
Любой совет будет высоко ценится, я не могу понять, почему оно работает как консольное приложение, но не в том случае, если оно выполняется SharePoint. Это с той же учетной записью пользователя, на той же машине ...
Это код, используемый для вызова DLL:
[DllImport("idDll.dll", EntryPoint = "GetMachineId", SetLastError = true)]
extern static string GetComponentId([MarshalAs(UnmanagedType.LPStr)]String s);
public static string GetComponentId()
{
Debugger.Break();
if (_machine == string.Empty)
{
string temp = "";
id= ComponentId.GetComponentId(temp);
}
return id;
}