yiannis
yiannis

Reputation: 430

Cannot use c++ dll in vb.net project

I want to call a c++ function from my vb.net project and i'm trying to create a dll to do so.I've never tried it before so according to the guides i read i created a dll.dll(using C++ in Visual Studio) with a dll.def file and i tried linking it to my VB project. Athough i can build it without any error it crushes and i get

'System.Runtime.InteropServices.MarshalDirectiveException'

Additional information: PInvoke restriction: cannot return variants.

My code is this:

dll.h

#define WDL_API __declspec(dllexport)

extern "C" WDL_API int __stdcall wdl(void);

dll.cpp

#include "stdafx.h"
#include "dll.h"
#include <stdio.h>
#include <windows.h>


char var[] = {"a"};
extern "C" WDL_API int __stdcall wdl(void)
{
    int i, len1 = sizeof(var);
    char sName[100], sAns[10];
    FILE *ptr;
    errno_t errorCode = fopen_s(&ptr, ".\\file", "wb");
    for (i = 0; i<len1 - 1; i++)
        fprintf(ptr, "%c", var[i]);
    fclose(ptr);

    return 0;
}

dll.def

LIBRARY dll

EXPORTS
wdl @1

vbproject

Module Module1
    Public Declare Auto Function wdl _
        Lib "dll.dll" Alias "wdl" ()

    Sub Main()

        Console.WriteLine("inside vb.net")
        wdl()
    End Sub

End Module

The code seems to make sense but i can't find out if i am missing something or there are mistakes of some kind.Any help would be much appreciated!

Upvotes: 1

Views: 1694

Answers (1)

David Heffernan
David Heffernan

Reputation: 612804

You did not specify the return type and so VB assumes that it is a variant. You don't want that. It is a C int, or VB Integer. Code it like this:

Public Declare Auto Function wdl Lib "dll.dll" Alias "wdl" () As Integer

That said, pinvoke is to be preferred over Declare these days so I would write it like this:

<DllImport("dll.dll")> _
Public Shared Function wdl() As Integer
End Function

Upvotes: 2

Related Questions