6

my_cs_dll.dll静的メンバー関数を持つ静的クラスを定義するC# DLL ファイル プロジェクト ( ) があります。

namespace Foo
{
    public static class Bar
    {
        public static double GetNumber() { return 1.0; }
    }
}

を使用している C++ DLL プロジェクトもあります/clr

#using <my_cs_dll.dll>

double get_number_from_cs() { return Foo::Bar::GetNumber(); }

C++ プロジェクトの共通プロパティ参照セクションに参照を追加しました'my_cs_dll.dll'(コピー ローカル/コピー依存関係はどちらも True)。

'my_cs_dll.dll'また、C++ プロジェクトの構成プロパティ C/C++ の一般的な 'Resolve#using References' セクションにパスを追加しました。

my_cs_dll.dllすべてがエラーなしでビルドされますが、実行時に、アセンブリが見つからないと主張するシステムから「System.IO.FileNotFound」例外が発生し続けます。

どちらの DLL ファイルも、実行しているディレクトリと同じディレクトリに確実に存在します。

上記の設定であらゆる種類のバリエーションを試し、管理された/管理されていない相互運用で見つけることができるすべてを読みましたが、何が間違っているのか頭を悩ませているようです...

Visual Studio 2008 と .NET 3.5 を使用しています。

4

1 に答える 1

4

C# アセンブリが実行時に解決されていないようです。C# dll は、実行可能ファイルと同じディレクトリ (またはサブディレクトリ) にありますか? これを行ってからしばらく経ちましたが、私の記憶では、アセンブリが GAC にインストールされていない限り、使用している dll の場所ではなく、実行可能ファイルが配置されているディレクトリ (またはサブディレクトリ) にある必要があります。それ。これは、.NET セキュリティ機能に関係しています。

それでも問題が解決しない場合は、自分でアセンブリを解決してみてください。clr 対応の C++ プロジェクトで、次を追加してみてください。

using namespace System;
using namespace System.Reflection;
void Resolve()
{
    AppDomain::CurrentDomain->AssemblyResolve +=
        gcnew ResolveEventHandler(OnAssemblyResolve);
}
Assembly ^OnAssemblyResolve(Object ^obj, ResolveEventArgs ^args)
{
#ifdef _DEBUG
    String ^path = gcnew String(_T("<path to your debug directory>"));
#else
    String ^path = gcnew String(_T("<path to your release directory>"));
#endif
    array<String^>^ assemblies =
        System::IO::Directory::GetFiles(path, _T("*.dll"));
    for (long ii = 0; ii < assemblies->Length; ii++) {
        AssemblyName ^name = AssemblyName::GetAssemblyName(assemblies[ii]);
        if (AssemblyName::ReferenceMatchesDefinition(gcnew AssemblyName(args->Name), name)) {
            return Assembly::Load(name);
        }
    }
    return nullptr;
}

プロジェクトでコンパイルするには、コードを少し調整する必要がある場合があります。私の場合、clr 対応プロジェクトのクラスの 2 つの関数を静的メソッドにしました。Resolve()コードの早い段階で、つまり を呼び出す前に関数を呼び出すようにしてくださいget_number_from_cs()

COM の使用はオプションですが、必須ではありません。あなたは現在のアプローチで正しい道を進んでいます。手持ちが必要な場合は、このCodeProject の例をご覧ください。これは、アンマネージド アプリケーションでマネージド アセンブリを使用できるようにするためのものです。

于 2009-09-24T06:50:28.053 に答える