我正在将一些 vb.net 代码移植到 C# 并发现一个大问题完全停止了我的工作。这是一个需要移植的小vb代码
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim objSitesContainer
Dim objSite
Dim strSite1RDN As String = "TestSite1-MKFPKFMSJJCWJUB"
Dim strSitesContainer As String = "LDAP://DC9.domain9.local/CN=Sites,CN=Configuration,DC=domain9,DC=local"
Try
Const ADS_PROPERTY_APPEND = 3
objSitesContainer = GetObject(strSitesContainer)
objSite = objSitesContainer.Create("site", "CN=" & strSite1RDN)
objSite.SetInfo()
MessageBox.Show("All ok")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
我使用 SharpDevelop 帮我将其转换为 C#(任何其他在线工具生成基本相同的代码)输出代码如下所示
private void button1_Click(object sender, EventArgs e)
{
try
{
string strSitesContainer = "LDAP://DC9.domain9.local/CN=Sites,CN=Configuration,DC=domain9,DC=local";
string strSite1RDN = "TestSite1-MKFPKFMSJJCWJUB";
dynamic objSitesContainer;
dynamic objSite;
objSitesContainer = Interaction.GetObject(strSitesContainer);
objSite = objSitesContainer.Create("site", "CN=" + strSite1RDN);
objSite.SetInfo();
MessageBox.Show("All ok");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
它编译得很好。但是,当调用“Create”方法并出现这样的异常时,它在运行时惨遭失败The method or operation is not implemented
。为什么这样?动态不应该像在VB中一样工作吗?
好吧,无论如何,我检查了反射器以查看从 VB 代码生成的内容,这里是
private void Button1_Click(object sender, EventArgs e)
{
string str = "TestSite1-MKFPKFMSJJCWJUB";
string pathName = "LDAP://DC9.domain9.local/CN=Sites,CN=Configuration,DC=domain9,DC=local";
try
{
NewLateBinding.LateCall(RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(RuntimeHelpers.GetObjectValue(Interaction.GetObject(pathName, null)), null, "Create", new object[] { "site", "CN=" + str }, null, null, null)), null, "SetInfo", new object[0], null, null, null, true);
MessageBox.Show("All ok");
}
catch (Exception exception1)
{
ProjectData.SetProjectError(exception1);
Exception exception = exception1;
MessageBox.Show(exception.Message);
ProjectData.ClearProjectError();
}
}
这与任何人的预期完全不同?为什么 SharpDevelop 会生成这样错误的代码?
解决此问题的最佳方法是什么?在我正在移植的应用程序中,大约有 1000 个地方存在此类调用,我会说手动完成会非常困难。
欢迎任何想法。谢谢