2

ネイティブCOMクライアントのC#.NETDLLからCOMオブジェクトを作成しようとしています。これはC#.NETコードです

using System;
using System.Reflection;
using System.Runtime.InteropServices;

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: Guid("3B6B6C37-A5BC-45DF-878E-E9D5C8B009D8")]

namespace NetTestCom
{
    [ComImport]
    [Guid("508012FC-26A9-4985-A985-3EBB03D8D3A6"),
        ComVisible(true)]
    public interface ITestClass
    {
        int StrToInt(String S);
    }

    [Guid("A3D56E20-0792-42D9-B2DD-BB8A8AD75394"),
        ComVisible(true)]
    public class TestClass : ITestClass
    {
        public int StrToInt(String S)
        {
            return Convert.ToInt32(S);
        }
    }
}

Visual StudioにCOM相互運用機能に登録し、CoCreateInstanceを呼び出すように指示すると、期待どおりに機能します。

ここで、登録のないSide-by-SideCOMと同じDLLを使用したいと思います。アプリケーションマニフェストに依存関係を追加します

<dependency>
  <dependentAssembly>
    <assemblyIdentity
      type="win32"
      name="NetTestCom.X"
      version="1.0.0.0" />
  </dependentAssembly>
</dependency>

NetTestCom.X.manifestファイルを作成します

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="NetTestCom.X"
    version="1.0.0.0" />

  <clrClass
    clsid="{A3D56E20-0792-42D9-B2DD-BB8A8AD75394}"
    progid="NetTestCom.TestClass"
    threadingModel="Both"
    name="NetTestCom.TestClass"
    runtimeVersion="v2.0.50727" >
  </clrClass>

  <file name="NetTestCom.dll"></file>
</assembly>

CoCreateInstanceを呼び出そうとすると、HRESULT0x80070002が表示されます。アプリケーション、DLL、およびマニフェストはすべて同じディレクトリにあります。

4

1 に答える 1

1

マニフェストに問題があるようです。この依存関係宣言をアプリケーションマニフェストに使用しました

<dependency>
  <dependentAssembly>
    <assemblyIdentity
      name="NetTestCom"
      version="1.0.0.0"
      processorArchitecture="MSIL" />
  </dependentAssembly>
</dependency>

このマニフェストはNetTestCom.manifest(GenMan32.exeで生成

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        name="NetTestCom"
        version="1.0.0.0"
        processorArchitecture="MSIL" />
    <clrClass
        clsid="{A3D56E20-0792-42D9-B2DD-BB8A8AD75394}"
        progid="NetTestCom.TestClass"
        threadingModel="Both"
        name="NetTestCom.TestClass"
        runtimeVersion="v2.0.50727">
    </clrClass>
    <file name="NetTestCom.dll">
    </file>
</assembly>

これで、期待どおりに機能します。

于 2012-05-11T07:13:50.360 に答える