1

私はいくつかの 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

これを C# に変換するために SharpDevelop を使用しました (他のオンライン ツールは基本的に同じコードを生成します)。出力コードは次のようになります。

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 ほどあります。手動で行うのはかなり難しいと思います。

どんなアイデアでも大歓迎です。どうも

4

0 に答える 0