我有很多共享点Web部件等,所有这些都是为任何CPU编译的,它们在32位共享点上运行良好,但是以64位迁移到Server 2008会导致以下错误:
试图加载格式错误的程序。(来自HRESULT的异常:0x8007000B)
从我的阅读来看,它们应该都可以正常工作吗?
我有一个SharePoint DLL,它可以执行一些许可,并且作为代码的一部分,它使用外部C++ DLL来获取硬盘的序列号.
当我在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"
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用Visual Studio调试DLL.
我试过包装用于调用DLL的代码:
SPSecurity.RunWithElevatedPrivileges(delegate()
Run Code Online (Sandbox Code Playgroud)
但这也无济于事.
我有这个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;
}
Run Code Online (Sandbox Code Playgroud) 所以我有一个类在新的后台工作程序中启动一个新类,后台工作程序使用progresschanged部分传回状态消息.
当我尝试并通过键入使用它
classname.Dataworker.reportprogress(5)
Run Code Online (Sandbox Code Playgroud)
从一个单独的类我得到一个错误,我在定义之前使用一个对象.
我发现的例子都使用了一个类和不同的函数.
这可能是一个愚蠢的容易错误,但我只是看不到它,感谢您提供的任何帮助!
我的代码概述如下:
//form class
public static BackgroundWorker bw = new BackgroundWorker();
onbuttonclick
{
installer install = new installer();
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += class2.aFunction;
bw.ProgressChanged += new ProgressChangedEventHandler(mainForm_InstallerEvent);
bw.RunWorkerAsync();
}
private void mainForm_InstallerEvent(object sender, ProgressChangedEventArgs e)
{
lbl.Text = e.UserState.ToString();
}
Run Code Online (Sandbox Code Playgroud)
//// class2后台工作者类
aFunction
{
InstallerForm.bw.ReportProgress(5); //errors on this!
}
Run Code Online (Sandbox Code Playgroud) 我叫obackgroundworker.CancelAsync(); 在一个后台工作者当前在另一个线程中做一些工作然后使用while(obackgroundworker.IsBusy == true)等待它在退出应用程序之前完成(如果用户在线程离开处理时改变主意并且我想要干净地关闭)
取消挂起的单位正确设置为true但线程没有退出,在工作线程中我有:
backgroundworker obackgroundworker = (backgroundworker)sender;
if (obackgroundworker.cancellationpending == true)
e.cancel = true;
Run Code Online (Sandbox Code Playgroud)
应检查取消是否待定,然后将取消的标志设置为true,我认为这也会导致线程实际终止...?或者,当检测到取消实际结束时,是否需要从线程调用其他函数?
我已经阅读了很多使用背景工作者的例子,并且没有报告任何问题.
资料来源:
http://www.albahari.com/threading/part3.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads. ASPX
谢谢
我继承了一个有一个下一个和后一个按钮的根表单,然后在一些子表单上使用这些按钮,并获得两次调用的按钮,我相信这里将在MSDN中列出的问题:http: //msdn.microsoft.com /en-us/library/e33683a5(VS.71).aspx
我将如何应用他们给C#而不是VB的建议?
感谢,我的所有按钮都被调用两次会导致很多问题.
码:
根形式
public partial class rootForm : Form
{
public rootForm()
{
InitializeComponent();
}
private void rootForm_Load(object sender, EventArgs e)
{
//used for all generic strings e.g. buttons
this.Text = Resources.UIStrings.FormTitle.ToString();
this.btnNext.Text = Resources.UIStrings.btnNext.ToString();
this.btnBack.Text = Resources.UIStrings.btnBack.ToString();
}
Run Code Online (Sandbox Code Playgroud)
来自设计师:
// btnNext
//
this.btnNext.DialogResult = System.Windows.Forms.DialogResult.Cancel;
resources.ApplyResources(this.btnNext, "btnNext");
this.btnNext.Name = "btnNext";
this.btnNext.UseVisualStyleBackColor = true;
Run Code Online (Sandbox Code Playgroud)
安装表格
来自设计师
//
// btnNext
//
this.btnNext.Location = new System.Drawing.Point(373, 360);
this.btnNext.Size = new System.Drawing.Size(99, 23);
this.btnNext.TabIndex = 7;
this.btnNext.Text …Run Code Online (Sandbox Code Playgroud)