SharePoint无法在Windows 2008上加载C ++ DLL
我有一个SharePoint DLL,它执行一些许可事务,并且作为代码的一部分,它使用外部C ++ DLL来获取硬盘的序列号。
当我在Windows Server 2003上运行此应用程序时,它工作正常,但在Windows Server 2008上,整个站点(加载时加载)会不断崩溃并重置。 这不是Windows Server 2008 R2,并且在64或32位中是相同的。
如果我在DLL执行之前放置了一个Debugger.Break
,我会看到代码到达中断点,然后再也不会再回到DLL中。 我确实从函数内部得到了一些调试断言警告,只是在Windows Server 2008中,但我不确定这是相关的。
我创建了一个运行C#DLL的控制台应用程序,该应用程序依次加载C ++ DLL,并且这在Windows Server 2008上完美运行(虽然它确实显示了断言错误,但我现在已经抑制了这些错误)。 断言错误不在我的代码中,而是在ICtypes.c
,而不是我可以调试的东西。
如果我在DLL中放置一个断点,它永远不会被击中,编译器会说:
"step in: Stepping over non user code"
如果我尝试使用Visual Studio调试到DLL中。
我曾尝试包装用于调用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;
}
这可能与安全性有关:重要的一点是它可以在控制台应用程序中运行。
在控制台应用程序中,RunWithElevatedPrivileges不起作用,因为它会模拟您的工作进程的应用程序池用户,该用户对该框本身没有特殊权限。
相比之下,控制台应用程序在登录用户的上下文中运行。
试着模拟一个拥有权限的用户,比如当你运行这里指定的控制台应用程序时(使用撤销()内部try / finally记住你!)。 获取令牌时,您可以创建一个SPUserToken并使用SPSite构造函数建立站点上下文,该构造函数接受一个GUID和一个SPUserToken
在这里举几个例子来说明这种方法。
编辑:哦,它的工作在2003年的原因可能是您的应用程序池帐户有太多的权利;-)
为什么不使用WMI来获取硬盘的序列号,从而避免执行非托管代码。 请参阅此示例如何检索REAL硬盘序列号
这种非确定性的崩溃行为通常伴随着内存覆盖/损坏; 有时它很重要(崩溃),有时候你很幸运。
您可能需要检查获取故障转储并使用WindDbg进行分析。 既然你有源代码,你可以用各种堆栈重新构建它,启用堆内存保护和警告系统(取决于你的编译器),并看看你得到了什么。
链接地址: http://www.djcxy.com/p/7737.html