Debuggen met Express Edition

Dec 27th, 2009 | Posted by Anton | Filed under Algemeen

Het verschil tussen Visual Studio en de Express Edition is onder andere dat je niet kunt instellen dat je wilt debuggen in een programma zoals AutoCAD. Toch is het mogelijk en nog vrij simpel ook.

Na het aanmaken van een project zal er een mappenstructuur worden gemaakt en in de projectmap zal een bestand staan als projectnaam.vbproj.user. Dit betreft een XML-bestand en bevat de volgende regel:

<Project xmlns="<a href="http://schemas.microsoft.com/developer/msbuild/2003"> http://schemas.microsoft.com/developer/msbuild/2003</a>" />

Vervang de inhoud door dit:

<Project xmlns="<a href="http://schemas.microsoft.com/developer/msbuild/2003"> http://schemas.microsoft.com/developer/msbuild/2003</a>">
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <StartAction>Program</StartAction>
    <StartProgram>C:\Program Files\AutoCAD 2010\acad.exe</StartProgram>
    <StartWorkingDirectory>C:\Program Files\AutoCAD 2010\</StartWorkingDirectory>
  </PropertyGroup>
</Project>

Na het opnieuw opstarten van de Express Edition zal het mogelijk zijn om het project te debuggen in AutoCAD. Na het drukken op F5 start AutoCAD op waarna met het commando NETLOAD het programma kan worden ingeladen. Alle debug functionaliteit is nu aanwezig.

  1. EFL
    May 18th, 2010 at 13:00
    Reply | Quote | #1

    Ik heb een hele mooie Class1.vb gemaakt naar het voorbeeld van Stephen Preston (Autodesk Inc):

    Imports Autodesk.AutoCAD.Runtime
    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.DatabaseServices
    
    Public Class Class1
    
      <CommandMethod("HelloWorld")> _
      Public Sub MyMethod()
        Application.ShowAlertDialog("Hello World from VB.NET!")
      End Sub
    End Class
    

    Hierna heb ik de "Test20100518.vbproj.user" aangepast en zie er nu zo uit volgens het voorbeeld van deze site:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <StartAction>Program</StartAction>
        <StartProgram>C:\Program Files\AutoCAD 2010\acad.exe</StartProgram>
        <StartWorkingDirectory>C:\Program Files\AutoCAD 2010\</StartWorkingDirectory>
        <ProjectView>ShowAllFiles</ProjectView>
      </PropertyGroup>
    </Project>
    

    Na het bovenstaande toegepast te hebben in MS VB 2010 Express, druk ik F5 en Acad 2010 start,
    dan het commando "NETLOAD" en krijg ik de volgende melding:

    Command: NETLOAD
    Cannot load assembly. Error details: System.BadImageFormatException: Could not
    load file or assembly 'file:///U:\Visual Studio
    2010\Projects\Test20100518\Test20100518\bin\Debug\Test20100518.dll' or one of
    its dependencies. This assembly is built by a runtime newer than the currently
    loaded runtime and cannot be loaded.
    File name: 'file:///U:\Visual Studio
    2010\Projects\Test20100518\Test20100518\bin\Debug\Test20100518.dll'
    at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase,
    Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
    Boolean throwOnFileNotFound, Boolean forIntrospection)
    at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase,
    Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
    Boolean throwOnFileNotFound, Boolean forIntrospection)
    at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,
    Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
    at System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence
    securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm,
    Boolean forIntrospection, StackCrawlMark& stackMark)
    at System.Reflection.Assembly.LoadFrom(String assemblyFile)
    at Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
    at loadmgd()

    WRN: Assembly binding logging is turned OFF.
    To enable assembly bind failure logging, set the registry value
    [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
    Note: There is some performance penalty associated with assembly bind failure
    logging.
    To turn this feature off, remove the registry value
    [HKLM\Software\Microsoft\Fusion!EnableLog].

    Vervolgens heb ik geen nieuw commando: "HelloWorld"
    Wat doe ik niet goed of wat is er mis?

  2. EFL
    May 18th, 2010 at 16:36
    Reply | Quote | #2

    Ik ben nog wat aan het zoeken geweest en heb een oplossing gevonden:

    In de Solution Explorer met rechts klikken en kies properties...
    In het venster war volgt kun je op het tabblad "Compile" klikken...
    Hier kies je (onderaan) de knop [Advanced Compile Options...]
    Onderin het venster wat verschijnt zie je "Target framework (all configurations):"
    Kies hier ".NET Framework 2.0"

    Dat was mijn oplossing, overigens samen met het bovenstaande (projectnaam.vbproj.user aanpassen)

  3. Anton
    May 19th, 2010 at 09:12
    Reply | Quote | #3

    Mooi dat je de oplossing gevonden hebt!

  4. EFL
    May 20th, 2010 at 12:36
    Reply | Quote | #4

    Wat ik nu net ontdek is dat als ik een breakpoint zet in de code dat daar niet gestopt wordt.
    Met F5 (of F8) start ik de debug, Acad2010 start op en doe netjes NETLOAD en geef het commando wat ik gemaakt heb waarna Acad het programma ook afwerkt.
    Ik kan nu in Acad2010 mijn .dll laden en uitvoeren maar nog niet debuggen, waar het mij nu om gaat.

    Ik gebruik "MS VB 2010 Express"

  5. Anton
    May 20th, 2010 at 14:41
    Reply | Quote | #5

    Je moet heel zeker weten dat het project dat je debugged, ook gebruikt in AutoCAD, en niet per ongeluk de Release versie inleest.

  6. EFL
    Jun 2nd, 2010 at 12:45
    Reply | Quote | #6

    Ik heb alle versies gebruikt met hetzelfde resultaat.
    Een paar dagen later (waarschijnlijk na een update van MS) kreeg ik een melding dat er iets van .NET Framework 2.0 gemist werd.
    Toen heb ik .NET Framework 3.x gebruikt ging het wel weer met als resultaat dat "HelloWorld" wel werkte maar een simpele code uit de help van Acad2010 resulteerde in een "FATALERROR"