2014-10-19 3 views
0

Я пытаюсь создать игру Nim, где логика происходит на сервере, а клиент представляет игру, чтобы лучше работать на .NET Remoting , У меня есть библиотеки DLL, я построил из этой библиотеки классов:Необработанное исключение типа «System.IO.FileNotFoundException» - Dll & remoting

namespace Nim_Common 
{ 
    public interface computerCommon 
    { 
     int[] startGame(int columnNumber); 
     int[] computeTurn(int[] penStatus); 
     bool checkWin(); 
    } 
} 

этой библиотеку я добавляю в качестве ссылки на мой проект клиента и мой проект сервера и добавить DLL в каталог bin/Debug в каждом проекте.

Это соответствующая часть моего кода клиента:

using Nim_Common; 

namespace Nim 
{ 
    public partial class Form1 : Form 
    { 
      private computerCommon computerServerHandler; 
      ... 
public Form1() 
     { 
      InitializeComponent(); 
      computerToolStripMenuItem.Select(); 
      newColumnNumber = -1; 
      RemotingConfiguration.Configure("client.exe.config"); 
      computerServerHandler = (computerCommon)Activator.GetObject(typeof(computerCommon), "http://localhost:1234/_Server_"); 
      StartGame(this, null); 
     } 
private void StartGame(object sender, EventArgs e) 
     { 
      int max = 0; 
      if(columns != null) 
       for (int i = 0; i < columns.Length; i++) Controls.Remove(columns[i]); 
      int[] temp = computerServerHandler.startGame(newColumnNumber); 
      columns = new Column[temp.Length]; 
      ... 
     } 

И в серверной части:

using Nim_Common; 

namespace Nim_Server 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      RemotingConfiguration.Configure("server.exe.config"); 
     } 
    } 

    class ServerPart : MarshalByRefObject, computerCommon 
    { 
     ... 

     public ServerPart() 
     { 
      ... 
     } 
     public int[] startGame(int columnNumber) 
     { 
      ... 
     } 
     public int[] computeTurn(int[] penStatus) 
     { 
      ... 
     } 

     public bool checkWin() 
     { 
      ... 
     } 
    } 
} 

server.exe.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <system.runtime.remoting> 
    <application> 
     <channels> 
     <channel ref="http server" port="1234" /> 
     </channels> 
     <service> 
     <wellknown mode ="SingleCall" type="Nim_Server.ServerPart, Nim_Server" objectUri="_Server_" /> 
     </service> 
    </application> 
    </system.runtime.remoting> 
</configuration> 

Client.exe .config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <system.runtime.remoting> 
    <application> 
     <channels> 
     <channel ref="http client" /> 
     </channels> 

     <client> 
     <wellknown type="Nim_Common.computerCommon, Nim_Common" url="http://localhost:1234" /> 
     </client> 
    </application> 
    </system.runtime.remoting> 
</configuration> 

Мой брандмауэр выключен, если это имеет значение. Все в порядке во время компиляции, сервер работает нормально. Когда клиент достигает этой линии, он бросает исключение:

int[] temp = computerServerHandler.startGame(newColumnNumber); 

Исключение составляет что-то вроде:

An unhandled exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll 

Additional information: Could not load file or one of its dependencies, the system could not find "Nim_Common". // This is shown in my native language so I'm improvising a bit with the translation. 

Что происходит и как это исправить?

Спасибо.

ответ

0

Я получаю эту ошибку от одной из моих собственных скомпилированных библиотек. Оказывается, я заполнил AssemblyCultureAttribute в файле AssemblyInfo.cs. Проект построен без проблем, но не будет загружаться в любые проекты, на которые делается ссылка, когда они используются.

Согласно MSDN:

Ввод этого атрибута на сборку и использовать что-то другое, чем пустая строка («») для имени культуры сделает этот узел похож на спутниковой сборки, а не главный сборка, содержащая исполняемый код. Маркировка традиционной библиотеки кодов с этим атрибутом сломает ее, потому что ни один другой код не сможет найти точки входа библиотеки во время выполнения.