problem with calling C++/CLI wrapper to C++ code from C# applicati

G

Guest

I need to write a C# application that uses unmanaged C++ code. I created a
C++/CLI wrapper to C++ code and encountered the following problem. Any time I
try to instantiate a wrapper in C# application the program crashes with an
error
"An unhandled exception of type 'System.IO.FileNotFoundException' occurred
in mscorlib.dll, Additional information: The specified module could not be
found. (Exception from HRESULT: 0x8007007E)". C# application has a reference
only to the wrapper and the wrapper has a reference to unmanaged dll. Similar
application written in C++/CLI gives exactly the same error if it has a
reference only to the wrapper namespace. In case of C++/CLI application,
VS2005 allows to add a reference to unmanaged dll and then the application
works OK.
I have seen an example of managed C++ wrapper that is virtual identical to
the code below and is claimed to work with C#
(http://www.ondotnet.com/lpt/a/4731)
Cannot figure out what is the problem with my code.
Here is the code

//CppLib.h
#ifndef _CPPLIB_EXPORT_IMPORT
#ifdef _CPPLIB_EXPORT
#define _CPPLIB_EXPORT_IMPORT __declspec(dllexport)
#else
#define _CPPLIB_EXPORT_IMPORT __declspec(dllimport)
#endif
#endif

class _CPPLIB_EXPORT_IMPORT CCppLib
{
double _a;
double _b;
double _c;

public:
CCppLib(double a, double b, double c);
~CCppLib(){};

bool IsValid();

};
//CppLib.cpp

CCppLib::CCppLib(double a, double b, double c)
{
_a = a;
_b = b;
_c = c;
}

bool CCppLib::IsValid()
{
return (_a + _b > _c && _a + _c > _b && _b + _c > _a );
}

//CLRWrapper.h

#pragma once
#include "..\\CppLib\\CppLib.h"

using namespace System;

namespace CLRWrapper
{

public ref class Triangle
{
CCppLib* _CppLib;

public:

Triangle()
{
_CppLib = new CCppLib();
}

Triangle(double a, double b, double c)
{
_CppLib = new CCppLib(a, b, c);
}

~Triangle()
{
this->!Triangle();
}

!Triangle()
{
if (_CppLib != NULL)
delete _CppLib;
_CppLib = 0;
}

CCppLib* GetCppLib() { return _CppLib;}

bool IsValid()
{
if (_CppLib != NULL)
return _CppLib->IsValid();
return false;
}

};
}

// CLRTest.cpp C++/CLI test application
using namespace System;
using namespace CLRWrapper;

int main(array<System::String ^> ^args)
{
Triangle^ tr = gcnew Triangle(1, 2, 3);
Console::WriteLine(tr->IsValid());

return 0;
}

//Program.cs C# test application

using System;
using System.Collections.Generic;
using System.Text;
using CLRWrapper;

namespace TestTriangle
{
class Program
{
static void Main(string[] args)
{
Triangle tr = new Triangle(0.1, 0.2, 0.3);
Console.WriteLine(tr.IsValid());
}
}
}
 
G

Guest

"An unhandled exception of type 'System.IO.FileNotFoundException' occurred
in mscorlib.dll, Additional information: The specified module could not be
found. (Exception from HRESULT: 0x8007007E)".

This error could have something to do with the manifest in debugging mode.
Try to generate and embed the manifest in the assembly (linker/manifest
propertypage)

I found this out by using the procmon utility to see what file the loader
was looking for (msvcr80d.dll).
 
G

Guest

It occured to be my error unrelated to anything written in the post.
If directories are properly assigned everything works fine.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top